好的,也许这个问题以前已经被回答过了,但我一直在研究,只是找不到解决我的具体问题的方法。
示例代码 - 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(每个具体类型对应一个表)映射
运行迁移并更新数据库后,结果如下:
这正是我的期望。到目前为止一切都好。
但是……我决定增加一个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
表包含对 Genders
的外键,就像 Employees
和 Genders
一样。
我在 MyContext.OnModelCreating
中尝试了这个:
modelBuilder.Entity<ExecutiveEmployee>().Map(x =>
{
x.MapInheritedProperties();
x.Properties(c => c.Gender);// <<-- does not work
x.ToTable("ExecutiveEmployees");
});
但是当我尝试添加迁移时,我收到了以下错误消息:
类型为“ExecutiveEmployee”的属性“Gender”无法映射,因为它已被明确地从模型中排除,或者它是DbModelBuilderVersion不支持的类型。