ADO.NET已经支持hierarchyid类型,可以找到一个例子here http://blogs.msdn.com/b/jimoneil/archive/2009/02/23/h-is-for-hierarchyid.aspx并显示ADO.NET可以直接从Sql Server读取值作为hierarchyid,但您需要将参数作为字符串传递到服务器。
向 ORM 框架添加对 Hierarchyid 类型方法的支持将打破 ORM API 和 RDMS 之间的抽象。我认为这就是此类功能尚未添加到实体框架的原因。
您可以通过在数据库中保留层次结构的字符串表示形式并将 hierarchyid 版本作为数据库和 C# 类中的计算属性来解决此问题,您需要从 ORM 映射中排除计算的 C# 属性。
例如,您的表列将声明为:
[SqlHierarchyId] AS ([hierarchyid]::Parse([HierarchyId])) PERSISTED
你的班级为:
public class MyClass {
public string HierarchyId {
get;
set;
}
[Ignore]
public SqlHierarchyId SqlHierarchyId {
get {
return SqlHierarchyId.Parse(new SqlString(HierarchyId));
}
set {
HierarchyId = value.ToString();
}
}
}
这将保留来自 .Net 层的更新,并允许您使用 Hierarchyid 方法在 SQL Server 中构造查询并使用 .Net 层中的具体化对象。
您必须针对 ORM 层中的字符串表示形式构建查询,但这仍然可以利用一些 Hierarchyid 辅助方法,例如:
public IEnumerable<MyClass> GetDescendants(MyClass node) {
string currentLocation = node.HierarchyId;
string followingSibling
= node.SqlHierarchyId.GetAncestor(1)
.GetDescendant(node.SqlHierarchyId, SqlHierarchyId.Null)
.ToString();
return db.Select<MyClass>(n => n.HierarchyId > currentLocation
&& n.HierarchyId < followingSibling);
}
如果我的 ORMLite 语法错误,我深表歉意。