C# SQL Server层次结构ID和实体框架层次结构ID之间的差异
我看到了,以及相应的实体框架6类的不同行为C# SQL Server层次结构ID和实体框架层次结构ID之间的差异,c#,sql-server,entity-framework,entity-framework-6,hierarchy,C#,Sql Server,Entity Framework,Entity Framework 6,Hierarchy,我看到了,以及相应的实体框架6类的不同行为System.Data.Entity.HierarchyId(来自程序集EntityFramework.6.3.0\lib\net45\EntityFramework.dll)。 (我找不到此类型的api文档,但似乎与相同) 我有一个HierarchyId,例如childA='/1/1.1/'。现在我想在同一级别上获得下一个层次ID。 所以我调用childA.get祖先(1).getgenderant(childA,null) Sql server返回'
System.Data.Entity.HierarchyId
(来自程序集EntityFramework.6.3.0\lib\net45\EntityFramework.dll
)。(我找不到此类型的api文档,但似乎与相同) 我有一个
HierarchyId
,例如childA='/1/1.1/'
。现在我想在同一级别上获得下一个层次ID
。
所以我调用childA.get祖先(1).getgenderant(childA,null)
Sql server返回'/1/2/'
,但实体框架返回'/1/1.2/'
因此,当我通过Entity Framework将一个节点插入数据库时,它会得到一个与使用存储SQL过程或触发器时不同的ID,并且当我以后想通过其预测的ID搜索节点时,搜索可能会失败
有没有一种方法可以在EF中获得SQL行为,而无需数据库往返
示例SQL代码:
Declare@ChildA hierarchyid
选择@ChildA='/1/1.1/'
选择CAST(@ChildA.get祖先(1).getgeneratant(@ChildA,null)作为varchar)作为ChildB
--结果:ChildB='/1/2/'
示例C#代码:
var childA=newsystem.Data.Entity.HierarchyId(“/1/1.1/”);
var childB=childA.get祖先(1.getgenderant)(childA,null);
控制台写入线(childB);
//结果:ChildB=“/1/1.2/”
由于从逻辑上讲,这两个结果都是/1/
之后的/1.1/
的后代,因此它们选择该逻辑关系的不同表示形式会导致什么问题?一个问题是节点应该获得相同的可预测ID,无论它是通过SQL还是EF插入或更新的;否则,ID就没有那么有用了。我可以通过只使用SQL或EF来解决这个问题。但真正的问题是,EF ID将变得相当长且丑陋:)