在实体框架中使用视图

时间:2013-07-04 08:30:25

标签: sql-server entity-framework view

我在一个项目中使用Entity Framework,但我发现大型查询,特别是那些使用LEFT连接的查询,编写起来非常繁琐,而且难以调试。

在数据库中使用Views,然后在EntityFramework中使用这些视图是常见的还是可接受的做法?或者这是一种不好的做法?

2 个答案:

答案 0 :(得分:0)

问题不是很清楚,但是在软件中没有绝对的对与错。这完全取决于您的情况。

在ef core中对视图有本机支持,但在EF <6中没有对视图的本机支持,至少在当前最新版本6.3中没有。但是,有一个解决方法。首先在数据库中,您将通过sql正常创建视图,并且当您对数据库进行反向工程时,EF将把您的视图视为普通模型,并允许您像在普通表方案中那样定期使用它。在Code First中,这有点乏味。您将创建一个POCO对象,该对象映射到视图中的列。请注意,您需要在此POCO类中包含一个ID。例如

public class ViewPOCO
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public Guid Id {get;set;}
    public string ViewColumn1 {get;set;}
    ... etc.
}

您将在PObContext中添加此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>");
 }

答案 1 :(得分:-1)

首先创建您的视图 更新.edmx文件。
然后像这样使用。

using (ManishTempEntities obj = new ManishTempEntities())
{
     var a = obj.View_1.ToList();
}