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

时间:2015-07-06 16:53:50

标签: c# .net entity-framework entity-framework-4

以下是我首先要寻找的图表:

Diagram of Generic Object 所以我有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相关。以链接问题为例,一个订单将链接到一个托管或一个域,并将通过类型表。

1 个答案:

答案 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)