我在一个项目中使用Entity Framework,但我发现大型查询,特别是那些使用LEFT连接的查询,编写起来非常繁琐,而且难以调试。
在数据库中使用Views,然后在EntityFramework中使用这些视图是常见的还是可接受的做法?或者这是一种不好的做法?
答案 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();
}