在实体框架中使用视图
Posted
技术标签:
【中文标题】在实体框架中使用视图【英文标题】:Use Views in Entity Framework 【发布时间】:2013-07-04 08:30:24 【问题描述】:我在一个项目中使用实体框架,但我发现大型查询,尤其是那些使用左连接的查询,编写起来非常乏味,而且难以调试。
使用数据库中的视图,然后在 EntityFramework 中使用这些视图是常见的还是公认的做法?或者这是一种不好的做法?
【问题讨论】:
+1 我昨天也在为此苦苦挣扎。我想知道如何首先使用代码创建视图... 如何在没有连接语法的情况下进行左连接:blogs.teamb.com/craigstuntz/2010/01/13/38525 一些使用遗留数据库的人正试图远离视图:***.com/q/9016079/150342 【参考方案1】:这个问题不是很清楚,但是软件没有绝对的对错。这一切都取决于你的情况。
在 ef core 中有对视图的原生支持,但在 EF
public class ViewPOCO
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public Guid Id get;set;
public string ViewColumn1 get;set;
... etc.
你可以在你的 DbContext 中添加这个 POCO 类
public class MyDbContext : DbContext
public virtual DbSet<ViewPOCO> MyView get;set;
现在您通常会通过包管理器控制台应用添加迁移的命令
Add-Migration <MigrationName> <ConnectionString and provider Name>
现在在上下迁移中,您会注意到 EF 将您的模型视为表。您将清除所有这些并编写自己的 sql 以使用 Sql 函数在 up 中添加/更改视图并在 down 方法中删除视图。
public override void Up()
Sql("CREATE OR ALTER VIEW <ViewName> AS SELECT NEWID() AS Id, ...");
public override void Down()
Sql("DROP VIEW <ViewName>");
【讨论】:
【参考方案2】:首先创建您的视图。 更新您的 .edmx 文件。 然后像这样使用。
using (ManishTempEntities obj = new ManishTempEntities())
var a = obj.View_1.ToList();
【讨论】:
我在问更多在实体框架中使用视图是否更“好”。我想知道用视图做更复杂的左连接是否可以接受,而不是使用 linq。 拥有视图比通过 LINQ 连接所有数据更好,因为视图是在 SQL(如 SP)中预编译的,因此它们可以更快地返回结果。视图不需要将所有数据类型从 SQL 转换/转换为 C# 数据类型,这样可以使它们更快......所以如果你有越来越多的数据,你会希望使用视图而不是经典 EF(即使我我自己是 EF 粉丝)。快乐的编码(即使这个 cmets 来得有点晚了)以上是关于在实体框架中使用视图的主要内容,如果未能解决你的问题,请参考以下文章