【问题标题】:Is it possible to relate one table to one of a group of tables based off of id using Entity Framework?是否可以使用实体框架将一个表与基于 id 的一组表中的一个相关联?
【发布时间】:2015-07-07 07:37:51
【问题描述】:

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

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

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

(A) 我可以在 MainObject 表上拥有 EntityA_Id、EntityB_Id、EntityC_Id 列来与之关联。

(B) 我可以在 MainObject 表上有 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?,但据我了解,它试图通过链接器表将多对多关联起来,而每个 MainObject 将与 A、B 或 C 之一相关(以及 A、B、而 C 可以与许多 MainObjects 相关联)。以链接问题为例,一个订单将链接到一个主机或一个域,并通过类型表。

【问题讨论】:

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


    【解决方案1】:

    我认为您追求的是按层次结构设计的表 (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)

    【讨论】:

    • 哇,这是一个宝库。这绝对有用,如果我在这里找到我的答案,我会回来接受这个答案。
    • TPT 方法似乎是我正在寻找的,但是实体在已经填充的表中,我们当前的做法是使用数据库优先建模 - 我正在寻找实现链接和继承。一位同事争辩说,如果我们想要链接到的每种类型的实体的 id 列(因此每个实体中的 EntityId、AId、BId、CId 等)只有一个表,那么它会更加“行业标准”记录,只有 EntityId 和其他列之一具有值)并使用关系而不是实现继承。这首先在数据库中可行吗?
    • 我刚刚编辑了这个示例以删除危险的初始化策略,因为您不想删除数据库。您可能希望使用实体数据模型向导中的“数据库中的代码优先”选项对当前数据结构进行逆向工程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-10
    • 1970-01-01
    相关资源
    最近更新 更多