1

我有一个表示文件树结构的单个数据库表。

Files
- Id (int, primary key)
- Name
- ParentId (int, foreign key to Files.Id)

如何编写一种方法来确保孩子的所有父母都不能将孩子的 Id 作为其 ParentId 以防止在显示树结构时出现无限循环。

另外,有没有更有效的方法来设计这个?

更新:我使用支持层次 id 的 sql server 2008,会有帮助吗?(我不确定 EF 是否支持它)

4

2 回答 2

2

您可能会添加一个“级别”值,然后您只需要确保没有节点的父节点的级别大于或等于它自己的级别。添加节点时,您会将新的子节点设置为父节点级别 + 1。

干杯

于 2012-07-09T18:04:42.150 回答
0

我看不出您如何使用 LINQ 有效地编写此代码 - 您将不得不进行太多的数据库查询。相反,您应该考虑编写一个存储过程来在数据库端检查它。

替代方法可能是每个元素不仅存储父 ID,而且存储从根元素一直到其自身的整个层次结构路径 - 请参阅相关 SO 问题中的示例。然后,您的工作将只包括检查路径是否不包含两个相同的 ID 并拒绝具有此类路径的元素 - 这可以通过数据库端的触发器或应用程序中的某些验证器来完成。

编辑:

关于 HierarchyId - 它似乎不是在实体框架中使用它的内置方式,至少在 .NET 4.5 之前没有。您可能想查看这个 SO question - 它包含一个自定义实现,应该使您能够在实体框架中使用 HierarchyId。

于 2012-07-09T17:59:53.730 回答