在实体框架中使用视图

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 来得有点晚了)

以上是关于在实体框架中使用视图的主要内容,如果未能解决你的问题,请参考以下文章

实体框架中的视图?

如何使用实体框架测试视图?

首先将可更新视图与实体框架代码一起使用

视图和实体框架

带有 Sql 视图的实体框架在生成 .sql 文件中显示为表

视图和实体框架数据不对?