每个具体类型外键的实体框架表

时间:2013-08-04 15:06:53

标签: inheritance entity-framework-5 table-per-class

我有以下类层次结构

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创建表?我希望每个派生类都有单独的表,但没有公用表。

1 个答案:

答案 0 :(得分:0)

在EF核心中,modelBuilder.Ignore将发挥神奇作用:

modelBuilder.Ignore<B>();

不确定EF 5-6是否具有类似功能。

: 浏览帖子Inheritance with EF Code First - Table per Hierarchy (TPH),您会发现:

  

无论是在性能还是在性能上,这种映射策略都是赢家   简单。这是表现最好的方式   多态—执行多态查询和非多态查询   很好-而且手动实施也很容易。临时报告是   没有复杂的联接或联合的可能性。模式演变是   简单

因此,出于性能原因,也许您可​​以考虑上述方法,但这实际上取决于您的实际项目。如果您有大量的儿童班,则可以根据需要将它们拆分为表格。