好吧,可能这个问题之前已经回答过,但我一直在研究,我只是找不到解决我的具体问题的方法
此示例的代码 - 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
的外键和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 不支持的类型。