我有以下类层次结构
public class A
{
public int Id { get; set; }
public virtual IColection<B> Items {get; set; }
}
public abstract class B
{
public int Id {get; set; }
public A Parent {get; set; }
}
public class C : B
{
public String Name {get; set; }
}
我正在尝试使用每个具体类型层次结构映射表和以下代码到DataContext
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<C>().Map(m =>
{
m.MapInheritedProperties();
m.ToTable("C_Table");
});
}
实体框架仍会创建两个表。一个用于B类,包括外键的Id和A_Id字段。除了引用A之外的所有字段的C的第二个。
是否可以配置EF不为B创建表?我希望每个派生类都有单独的表,但没有公用表。
答案 0 :(得分:0)
在EF核心中,modelBuilder.Ignore
将发挥神奇作用:
modelBuilder.Ignore<B>();
不确定EF 5-6是否具有类似功能。
但: 浏览帖子Inheritance with EF Code First - Table per Hierarchy (TPH),您会发现:
无论是在性能还是在性能上,这种映射策略都是赢家 简单。这是表现最好的方式 多态—执行多态查询和非多态查询 很好-而且手动实施也很容易。临时报告是 没有复杂的联接或联合的可能性。模式演变是 简单
因此,出于性能原因,也许您可以考虑上述方法,但这实际上取决于您的实际项目。如果您有大量的儿童班,则可以根据需要将它们拆分为表格。