具有父子关系的自引用表,使用LINQ表示文件树

时间:2012-07-09 17:51:55

标签: c# database linq sql-server-2008 linq-to-entities

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

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

干杯

答案 1 :(得分:0)

我不知道如何使用LINQ有效地编写这个 - 你必须进行太多的数据库查询。相反,您应该考虑编写一个存储过程来在数据库端进行检查。

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

编辑:

关于HierarchyId - 似乎没有内置的方式在Entity Framework中使用它,至少在.NET 4.5之前是这样。您可能想要查看this SO question - 它包含一个自定义实现,可以让您在Entity Framework中使用HierarchyId。