EntityFramework 5 Code First多重继承映射(TPC)

Jup*_*aol 8 c# entity-framework ef-code-first entity-framework-mapping entity-framework-5

好吧,可能这个问题之前已经得到了回答,但我一直在研究,我找不到解决我特定问题的方法

此示例的代码 - Visual Studio 2012 - 控制台应用程序

所以我有一个带有多个继承对象的EntityFramework Code First模型.我创建了这个代表我的问题的例子:

模型

public abstract class Person
{
    [Key]
    public Guid PersonId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class Employee : Person
{
    public decimal BaseSalary { get; set; }
}

public class ExecutiveEmployee : Employee
{
    public string Title { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

上下文

public class MyContext : DbContext
{
    public DbSet<Employee> Employees { get; set; }
    public DbSet<ExecutiveEmployee> ExecutiveEmployees { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Employee>().Map(x =>
            {
                x.MapInheritedProperties();
                x.ToTable("Employees");
            });

        modelBuilder.Entity<ExecutiveEmployee>().Map(x =>
            {
                x.MapInheritedProperties();
                x.ToTable("ExecutiveEmployees");
            });
    }
}
Run Code Online (Sandbox Code Playgroud)

我想使用TPC(Table Per Concrete Type)映射

运行迁移并更新我的数据库后,结果如下:

在此输入图像描述

这是我的期望.到现在为止还挺好.

但是后来......我决定在Gender我的Person班级中添加一个对象和一个属性:(这不是我真正的模型,它只是一个例子)

public class Gender
{
    [Key]
    public Guid GenderId { get; set; }

    [Required]
    [MaxLength(250)]
    public string Name { get; set; }
}

public abstract class Person
{
    ....
    public Gender Gender { get; set; }
    ....
}

public class MyContext : DbContext
{
    ....
    public DbSet<Gender> Genders { get; set; }
    ....
 }
Run Code Online (Sandbox Code Playgroud)

应用迁移并更新数据库后,这是数据库模型:

在此输入图像描述

WHYYYYYYYY?

我错过了什么?我只是希望EF 在我的继承层次结构中映射我的引用属性.我希望该ExecutiveEmployees表包含一个Genders完全Employees和的外键Genders

我尝试过这个MyContext.OnModelCreating:

modelBuilder.Entity<ExecutiveEmployee>().Map(x =>
    {
        x.MapInheritedProperties();
        x.Properties(c => c.Gender);// <<-- does not work
        x.ToTable("ExecutiveEmployees");
    });
Run Code Online (Sandbox Code Playgroud)

但是当我尝试添加迁移时,我收到此错误:

无法映射类型为'ExecutiveEmployee'的属性'Gender',因为它已从模型中明确排除,或者它是所使用的DbModelBuilderVersion不支持的类型.

Ibr*_*jar 2

嗯,这很奇怪,我将您的示例运行到 Visual Studio 中,并使用 EF Power Tools 来查看 EDMX 生成器如何可视化这些关系,这就是我得到的: 实体数据模型
从这个图中我可以看出为什么会出错,因为现在实体框架假设导航属性已经在父类中找到。现在至于如何,我认为这是关于 Code First 与 TPC 中的多级继承的错误,应该修复。