防止循环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。
- 如何防止循环引用
- 是否在设置时完成此检查
- 默认情况下层次结构 ID 类型是否为我提供此功能?
每个类型 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)。前三点是关于层次的;第四个是关于继承。
据我所知,EF 不直接支持您所说的循环引用检查。不过你可以自己做(在 SQL 服务器的情况下,例如通过使用 CTE 创建 CHECK 约束)
由于EF不支持这种形式的循环检查,所以根本不检查。
EF 不直接支持 HierarchyID。您可以查看 some third-party library,它增加了对 hierarchyid 的支持。
这一点其实不是关于parent/child,而是关于如何在数据库中表示class继承。您提到的所有选项都在相应的知识库文章中进行了解释:Implementing Inheritance with the Entity Framework
总的来说,让Student和Course继承一个东西似乎不是一个好主意;这些大多是无关的。您可以再创建一个条目,例如 "AuditInfo",然后在学生和课程 class 中添加对它的引用。可能更有意义。
我在 Entity Framework 中使用 Table Per Hierarchy TPH,这基本上是扩展数据类型的公共核心属性的部分 class。
我有2个Objects/Classes; Course
对象和一个 Student
对象,它们与 MyBaseCommonEntity
共享相同的基本属性。目标是能够对任一对象执行 Service/ticket
。我在建模方面需要帮助,这是通用类型还是继承类型?
我的问题:我正在使用 int 来引用 parentID。 table的pK Key也是一个int。
- 如何防止循环引用
- 是否在设置时完成此检查
- 默认情况下层次结构 ID 类型是否为我提供此功能?
每个类型 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)。前三点是关于层次的;第四个是关于继承。
据我所知,EF 不直接支持您所说的循环引用检查。不过你可以自己做(在 SQL 服务器的情况下,例如通过使用 CTE 创建 CHECK 约束)
由于EF不支持这种形式的循环检查,所以根本不检查。
EF 不直接支持 HierarchyID。您可以查看 some third-party library,它增加了对 hierarchyid 的支持。
这一点其实不是关于parent/child,而是关于如何在数据库中表示class继承。您提到的所有选项都在相应的知识库文章中进行了解释:Implementing Inheritance with the Entity Framework
总的来说,让Student和Course继承一个东西似乎不是一个好主意;这些大多是无关的。您可以再创建一个条目,例如 "AuditInfo",然后在学生和课程 class 中添加对它的引用。可能更有意义。