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 (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; }
    ....
 }

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

在此处输入图像描述

为什么?

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

我在我的MyContext.OnModelCreating

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

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

无法映射类型“ExecutiveEmployee”上的属性“Gender”,因为它已从模型中显式排除,或者它属于正在使用的 DbModelBuilderVersion 不支持的类型。

4

1 回答 1

2

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

于 2013-03-16T00:18:47.310 回答