Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用LINQ表示文件树的具有父子关系的自引用表_C#_Database_Linq_Sql Server 2008_Linq To Entities - Fatal编程技术网

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的一个结束节点。这是一个有效的用例,但会使您的测试失败。为了表示文件,我认为这不是一个好的用例。该层次结构将被复制或移动,然后需要重新分配级别。