好吧,可能这个问题之前已经得到了解答,但我一直在研究,我找不到解决我特定问题的方法
Code of this sample - Visual Studio 2012 - Console App
所以我有一个包含多个继承对象的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) mapping
运行迁移并更新我的数据库后,结果如下:
这是我的期望。到目前为止一切顺利。
但是....... 我决定将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; }
....
}
应用迁移并更新数据库后,这是数据库模型:
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");
});
但是当我尝试添加迁移时,我收到此错误:
“ExecutiveEmployee”类型的属性“Gender”无法映射,因为它已从模型中明确排除,或者它是所使用的DbModelBuilderVersion不支持的类型。
答案 0 :(得分:2)
这很奇怪,我将你的样本运行到visual studio并使用EF Power Tools来查看EDMX生成器如何可视化这些关系,这就是我得到的:
从这个图中我可以看出为什么这是错误的,因为现在实体框架假设已经在父类中找到了导航属性。
至于如何,我认为这是一个关于Code First与TPC的多级继承的错误,应该修复。