0

我有以下类层次结构

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; }
}

我正在尝试对每个具体类型层次结构映射使用 Table 并将以下代码用于 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 字段。C 的第二个,除了对 A 的引用之外的所有字段。

是否可以配置 EF 不为 B 创建表?我想为每个派生类创建单独的表,但没有公用表。

4

1 回答 1

0

在 EF 核心中,modelBuilder.Ignore会变魔术:

modelBuilder.Ignore<B>();

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

但是:通过 EF Code First - Table per Hierarchy (TPH) 的帖子继承,您会发现:

这种映射策略在性能和简单性方面都是赢家。它是表示多态性的最佳表现方式——多态和非多态查询都表现良好——甚至可以很容易地手动实现。无需复杂的联接或联合就可以进行临时报告。模式演变很简单。

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

于 2019-02-04T21:17:20.220 回答