防止循环parent_ID`表每个类型`vs`表每个层次结构`vs`表每个类`

时间:2015-11-01 19:33:19

标签: entity-framework inheritance table-per-type table-per-hierarchy

我在实体框架中使用Table Per Hierarchy TPH,它基本上是扩展数据类型的通用核心属性的部分类。

我有2个对象/类; Course对象和Student对象,它们与MyBaseCommonEntity共享相同的基本属性。目标是能够在任一对象上执行Service/ticket。我需要帮助进行建模,这是一个泛型类型还是继承类型?

我的问题:我使用int来引用parentID。表的pK键也是一个int。

  1. 如何阻止循环引用
  2. 设置
  3. 时是否完成此项检查
  4. Hierarchy id type是否默认为我提供此功能?
  5. 每个类型的表与每个层次结构的表对每个类的表格有什么区别?

    public partial class MyBaseCommonEntity
    {
        public int Id { get; set; }
        //Does it have any parents, does it belong to anyone
        public int? ParentId { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
    
        public System.DateTime CreatedDate { get; set; }
        public System.DateTime StartDate { get; set; }
        public System.DateTime? EndDate { get; set; }
    
        // Audit Stuff, whom, when why?
        public System.DateTime? AuditDate { get; set; }
        public string AuditUser { get; set; }
        public string AuditComments { get; set; }
    }
    

1 个答案:

答案 0 :(得分:0)

我认为你在这里混淆了两件事 - 层次结构支持(id / parentid)和类继承(重用一个基类)。前三点是关于等级的;第四是关于继承。

  1. 据我所知,EF并不直接支持您所说风格的循环引用检查。你可以自己做(虽然在SQL服务器的情况下,通过CTE创建一个CHECK约束)

  2. 由于EF不支持该格式的循环检查,因此根本不会检查。

  3. EF不直接支持HierarchyID。你可以看看some third-party library,它增加了对hierarchyid的支持。

  4. 这一点实际上不是关于父/子,而是关于如何在数据库中表示类继承。您提到的所有选项都在相应的知识库文章中进行了解释:Implementing Inheritance with the Entity Framework

  5. 一般来说,让学生和课程继承一件事似乎不是一个好主意;这些大多是无关的。你可以再做一次,比如" AuditInfo"并在Student和Course类中添加对它的引用。可能更有意义。