防止循环parent_ID `table per type` vs `table per hierarchy` vs `table per class`

Prevent cyclic parent_ID `table per type` vs `table per hierarchy` vs `table per class`

我在 Entity Framework 中使用 Table Per Hierarchy TPH,这基本上是扩展数据类型的公共核心属性的部分 class。

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

我的问题:我正在使用 int 来引用 parentID。 table的pK Key也是一个int。

  1. 如何防止循环引用
  2. 是否在设置时完成此检查
  3. 默认情况下层次结构 ID 类型是否为我提供此功能?
  4. 每个类型 table 与每个层次结构 table 与每个 class`

    table 之间有什么区别
    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; }
    }
    

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

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

  2. 由于EF不支持这种形式的循环检查,所以根本不检查。

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

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

总的来说,让Student和Course继承一个东西似乎不是一个好主意;这些大多是无关的。您可以再创建一个条目,例如 "AuditInfo",然后在学生和课程 class 中添加对它的引用。可能更有意义。