将sql视图映射到EF 6中的现有实体?

时间:2014-08-28 03:53:08

标签: entity-framework

我有一个表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");

    }

这是否可行,如果是这样的话,文档的示例或链接会很棒。

2 个答案:

答案 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很简单:

  1. 在您的Database.tt文件中(配置ReversePOCO的Settings对象),确保Settings.IncludeViews = true
  2. 查找Settings.ViewProcessing回调(类似于2.37.1版本中的310)。
    • 取消注释现有代码,并对其进行修改以适合您的首选项。您将需要列出视图中的哪些列是主键。
  3. 查找Settings.AddForeignKeys回调(在2.37.1版中的第326行附近)。
    • 取消注释现有代码,然后对其进行修改以匹配您想要的外键关系。这将确保正确创建Navigation属性(完全支持复合外键)。