以下是我首先要寻找的图表:
所以我有MainObject,主要对象可能与EntityA,EntityB或OR EntityC有关。举个例子......
让我们说MainObject是一张发票。 EntityA,EntityB和EntityC都是可以开票的不同实体。 所以我有以下选择:
(A)我可以将MainObject表上的EntityA_Id,EntityB_Id,EntityC_Id列与之关联。
(B)我可以在MainObject表上拥有Entity_Id和EntityType_Id,告诉我EntityType_Id是否为1然后我需要EntityA对象,ID为Entity_Id。
使用 A 我可以在通过实体框架检索MainObject时使用简单的MainObject.Include("EntityA").Include("EntityB").Include("EntityC")..
- 然后我必须对所有内容进行空检查,以确切了解它与MainObject。
使用 B 是否可以执行类似于A的操作,以便在尝试找出与其相关的内容时,不会为每个MainObject对象提供多个空字段?< / p>
这与How to relate table with one of many others?类似,但据我所知,它试图通过链接表将多个与多个相关联,而每个MainObject将与A,B或C中的一个相关(和A, B和C可以与许多MainObjects相关。以链接问题为例,一个订单将链接到一个托管或一个域,并将通过类型表。
答案 0 :(得分:1)
我认为你是在使用Table Perirarchy设计(TPH)。 见this good explanation
以下将创建一个带有鉴别器列的MainObjects表
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
{
}
如果您希望在每个类的数据库中都有单独的表,那么切换到Table Per Type(TPT)