我在一个项目中使用实体框架,但我发现大型查询,尤其是那些使用左连接的查询,编写起来非常乏味,而且难以调试。
在数据库中使用视图,然后在 EntityFramework 中使用这些视图是常见的还是公认的做法?或者这是一个不好的做法?
我在一个项目中使用实体框架,但我发现大型查询,尤其是那些使用左连接的查询,编写起来非常乏味,而且难以调试。
在数据库中使用视图,然后在 EntityFramework 中使用这些视图是常见的还是公认的做法?或者这是一个不好的做法?
这个问题不是很清楚,但是软件没有绝对的对错。这一切都取决于你的情况。
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>");
}
首先创建您的视图。
更新您的 .edmx 文件。
然后像这样使用。
using (ManishTempEntities obj = new ManishTempEntities())
{
var a = obj.View_1.ToList();
}