C# 使用LINQ表示文件树的具有父子关系的自引用表
我有一个表示文件树结构的数据库表C# 使用LINQ表示文件树的具有父子关系的自引用表,c#,database,linq,sql-server-2008,linq-to-entities,C#,Database,Linq,Sql Server 2008,Linq To Entities,我有一个表示文件树结构的数据库表 Files - Id (int, primary key) - Name - ParentId (int, foreign key to Files.Id) 如何编写一个方法,确保子对象的所有父对象都不能将子对象的Id作为其父对象Id,以防止在显示树结构时出现无限循环 Files - Id (int, primary key) - Name - ParentId (int, foreign key to Files.Id) 还有,有没有更有效的设计方法 更新
Files
- Id (int, primary key)
- Name
- ParentId (int, foreign key to Files.Id)
如何编写一个方法,确保子对象的所有父对象都不能将子对象的Id作为其父对象Id,以防止在显示树结构时出现无限循环
Files
- Id (int, primary key)
- Name
- ParentId (int, foreign key to Files.Id)
还有,有没有更有效的设计方法
更新:
我使用sql server 2008,它支持层次结构id,这会有帮助吗?(我不确定EF是否支持它)我不知道如何使用LINQ高效地编写此文件-您必须进行太多的数据库查询。相反,您应该考虑编写一个存储过程,以在数据库方面检查它。 另一种方法是,每个元素不仅要存储父元素的ID,还要存储从根元素到自身的整个层次结构路径—请参阅。然后,您的工作将只包括检查路径是否不包含两个相同的ID,并使用这样的路径拒绝元素——这可以通过数据库端的触发器或应用程序中的某个验证器来完成 编辑:
关于HierarchyId,在实体框架中使用它似乎没有内置的方式,至少在.NET4.5之前是这样。您可能想签出—它包含一个自定义实现,应该使您能够在实体框架中使用HierarchyId 您可以添加一个“level”值,然后只需确保没有节点的父节点的级别大于或等于其自身的级别。添加节点时,应将新的子节点设置为父节点级别+1
Cheers您可以添加一个“级别”的值,然后只需确保没有节点的父节点的级别大于或等于其自身的级别。这可能会导致其他问题。如果parentId被更改怎么办?然后它必须更新所有相关数据库中的所有层次结构entries@James是的,你是对的,这可能会有问题。另一方面,显示树变得非常简单-所有信息都已在您的掌握中。我认为这在合并两棵树时不起作用。有两棵独立的树。我将树A的第一个节点连接到树B的一个结束节点。这是一个有效的用例,但会使您的测试失败。为了表示文件,我认为这不是一个好的用例。该层次结构将被复制或移动,然后需要重新分配级别。