【问题标题】:Entity Framework Table Per Concrete Type foreign key每个具体类型外键的实体框架表
【发布时间】:2013-08-05 08:17:24
【问题描述】:

我有以下类层次结构

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

Entity Framework 仍然创建两个表。一个用于 B 类,包括外键的 Id 和 A_Id 字段。 C 的第二个,除了对 A 的引用之外的所有字段。

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

【问题讨论】:

  • 那么为什么 B 是抽象的?
  • 因为 A 有 B 项,所以它需要一张可以查询其子项的表。 EF 不能通过unioning 多个子表来查询子表。无论如何这都是一个问题,因为现在您必须确保每个派生类都有自己的 PK 范围,因此 B 中的 PK 是唯一的。

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


【解决方案1】:

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

modelBuilder.Ignore<B>();

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

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

这种映射策略在性能和 简单。这是表现最好的表现方式 多态性——多态和非多态查询都执行 好——而且它甚至可以很容易地手动实现。临时报告是 可能没有复杂的连接或联合。模式演化是 直截了当。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多