2

我在一个项目中使用实体框架,但我发现大型查询,尤其是那些使用左连接的查询,编写起来非常乏味,而且难以调试。

在数据库中使用视图,然后在 EntityFramework 中使用这些视图是常见的还是公认的做法?或者这是一个不好的做法?

4

2 回答 2

1

这个问题不是很清楚,但是软件没有绝对的对错。这一切都取决于你的情况。

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.
}

你会在你的 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>");
 }
于 2019-10-15T12:07:16.287 回答
-1

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

using (ManishTempEntities obj = new ManishTempEntities())
{
     var a = obj.View_1.ToList();
}
于 2013-07-04T09:33:53.723 回答