我有一个表dbo.Tasks,Task类,一个TaskMap,并将它添加到DB上下文没问题。我还有一个返回Tasks的数据库视图dbo.vwComplexTaskQuery。如何将此视图映射到我的任务类?我希望能够做到:
List<Task> Tasks = db.vwComplexTaskQuery.ToList();
无需创建具有相同属性和相同数据注释的vwComplextTaskQuery类。
简化任务类
public class Task
{
public int TaskId { get; set; }
public string Title { get; set; }
}
简化的任务地图类
public TaskMap()
{
// Primary Key
this.HasKey(t => t.TaskId);
this.Property(t => t.Title)
.IsRequired()
.HasMaxLength(50);
// Table & Column Mappings
this.ToTable("Tasks");
this.Property(t => t.TaskId).HasColumnName("TaskId");
this.Property(t => t.Title).HasColumnName("Title");
}
这是否可行,如果是这样的话,文档的示例或链接会很棒。
答案 0 :(得分:2)
我找到了一个解决方案:
List<Task> tasks = db.Tasks.SqlQuery("Select * from vw_AllTasks").ToList<Task>();
答案 1 :(得分:0)
近4年后...(EF6已经推出了这么长时间?哇...)
默认情况下,EF不能很好地处理VIEW:EDMX(“数据库优先”)和“代码优先”的逆向工程都对视图进行了一些愚蠢的假设(例如,视图的类型不能与视图相同)。一个实体,一个视图的实体与其他实体没有关系,一个视图的所有NOT NULL
列都必须是复合主键,等等...
...但是,如果您手动覆盖EF生成的任何内容,以至于它认为VIEW是一个表,则它可以正常工作(导航属性等)。但是这样做有点困难,并且每当您从数据库更新模型时都需要重做。
幸运的是,有一个解决方案-如果您不介意动手:有一个第三方,开源的Entity Framework模型生成器T4模板(无需VS扩展:仅在您的文件中包含3个文件名为ReversePOCO的项目(也可以作为NuGet软件包提供):https://github.com/sjh37/EntityFramework-Reverse-POCO-Code-First-Generator(免责声明:几个月前,我专门提供了一些补丁来支持VIEW
处理)。
默认情况下,ReversePOCO中的T4模板生成的代码类似于EF6的Code First生成器创建的代码,但是处理VIEW很简单:
Database.tt
文件中(配置ReversePOCO的Settings
对象),确保Settings.IncludeViews = true
。Settings.ViewProcessing
回调(类似于2.37.1版本中的310)。
Settings.AddForeignKeys
回调(在2.37.1版中的第326行附近)。