是否可以使用 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)
这是我首先要寻找的图表:
假设 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)