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

8

好的,也许这个问题以前已经被回答过了,但我一直在研究,只是找不到解决我的具体问题的方法。

示例代码 - 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; }
}

背景

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");
            });
    }
}

我希望使用TPC(每个具体类型对应一个表)映射

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

enter image description here

这正是我的期望。到目前为止一切都好。

但是……我决定增加一个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; }
    ....
 }

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

enter image description here

为什么?

我错过了什么吗?我只想让 EF 映射我的继承层次结构中的 引用 属性。我期望 ExecutiveEmployees 表包含对 Genders 的外键,就像 EmployeesGenders 一样。

我在 MyContext.OnModelCreating 中尝试了这个:

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

但是当我尝试添加迁移时,我收到了以下错误消息:

类型为“ExecutiveEmployee”的属性“Gender”无法映射,因为它已被明确地从模型中排除,或者它是DbModelBuilderVersion不支持的类型。


我在EF中发布了一个错误:https://entityframework.codeplex.com/workitem/1049 - Jupaol
我从EF错误报告中读到了这样的信息:“但是,如果使用FK关联,则可以映射此类型的关系。” - 所以,如果您在Person类中添加[ForeignKey]字段到Gender,它应该可以工作(如果我理解正确的话)?您尝试过他们的解决方案吗? - Prokurors
1个回答

2
很奇怪,我将您的示例导入Visual Studio并使用EF Power Tools查看EDMX生成器如何可视化这些关系,结果如下图所示: Entity Data Model
从这个图表中可以看出为什么会出现问题,因为现在实体框架认为导航属性已经在父类中找到了。 至于如何解决,我认为这是Code First与TPC中的多级继承存在的一个bug,应该进行修复。

有道理,我也是这么想的。由于 EF 正在映射我的值类型而不是引用类型,所以这种行为让我认为这是一个错误 =(( - Jupaol

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接