是否可以使用 Entity Framework 将一个 table 与基于 id 的一组 table 中的一个相关联?

Is it possible to relate one table to one of a group of tables based off of id using Entity Framework?

这是我首先要寻找的图表:

所以我有 MainObject,主对象可能与 EntityA、EntityB 或 EntityC 相关。举个例子...

假设 MainObject 是一张发票。 EntityA、EntityB 和 EntityC 都是可以开具发票的不同实体。 所以我有以下选择:

(A) 我可以在 MainObject table 上有 EntityA_Id、EntityB_Id、EntityC_Id 列与之关联.

(B) 我可以在 MainObject table 上有 Entity_Id 和 EntityType_Id 告诉我如果 EntityType_Id = 1 然后我需要 ID 为 Entity_Id 的 EntityA 对象。

使用 A 我可以在通过 Entity Framework 检索 MainObject 时使用简单的 MainObject.Include("EntityA").Include("EntityB").Include("EntityC").. - 但是我必须对所有内容进行空检查以找出与 MainObject 关联的确切内容。

使用 B 是否可以做类似于 A 的事情,这样我在尝试找出它的相关内容时就不会为每个 MainObject 对象设置多个空字段到?

这类似于 How to relate table with one of many others?,但据我了解,它试图通过链接器 table 关联多对多,而每个 MainObject 将与 A、B、或 C(并且 A、B 和 C 可以与许多 MainObject 相关)。以链接问题为例,一个订单将链接到一个主机或一个域,并且将通过 table.

类型

我认为您正在寻求 Table Per Heirarchy 设计 (TPH)。 参见 this good explanation

下面将创建一个 MainObjects table 和一个鉴别器列

public class Model1Context : DbContext
{
    public Model1Context()
        : base("name=Model1")
    {

    }
    // For TPH
    public virtual DbSet<BaseBO> MainObjects { get; set; }

    // For TPT
    //public virtual DbSet<A> As { get; set; }
    //public virtual DbSet<B> Bs { get; set; }
    //public virtual DbSet<C> Cs { get; set; }
}

public class BaseBO
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class A : BaseBO
{
}

public class B : BaseBO
{
}

public class C : BaseBO
{
}

如果您希望每个 class 在数据库中有单独的 table,则切换到 Table 每个类型 (TPT)