Needles の回答をテスト実行しました。これは非常に良い答えですが、機能させるにはいくつかの変更が必要です(少なくとも.NET 4では)。これが私のプロジェクトのために思いついたものです:
更新: 次のコードは GitHub からダウンロードでき、そこで更新されます。 NHiberntate.HierarchyId.UserType
SqlHierarchyId IUserType
namespace NHibernate.UserTypes { using SqlTypes; using System; using System.Data; using System.Data.SqlTypes; using Microsoft.SqlServer.Types; public class HierarchyId : IUserType { #region Properties public SqlType[] SqlTypes { get { return new[] { NHibernateUtil.String.SqlType }; } } public Type ReturnedType { get { return typeof(SqlHierarchyId); } } public bool IsMutable { get { return true; } } #endregion Properties #region Methods new public bool Equals(object x, object y) { if (ReferenceEquals(x, y)) return true; if (x == null || y == null) return false; return x.Equals(y); } public int GetHashCode(object x) { return x.GetHashCode(); } public object NullSafeGet(IDataReader rs, string[] names, object owner) { object prop1 = NHibernateUtil.String.NullSafeGet(rs, names[0]); if (prop1 == null) return null; return SqlHierarchyId.Parse(new SqlString(prop1.ToString())); } public void NullSafeSet(IDbCommand cmd, object value, int index) { if (value == null) ((IDataParameter)cmd.Parameters[index]).Value = DBNull.Value; else if (value is SqlHierarchyId) ((IDataParameter)cmd.Parameters[index]).Value = ((SqlHierarchyId)value).ToString(); } public object DeepCopy(object value) { if (value == null) return null; return SqlHierarchyId.Parse(((SqlHierarchyId)value).ToString()); } public object Replace(object original, object target, object owner) { return DeepCopy(original); } public object Assemble(object cached, object owner) { return DeepCopy(cached); } public object Disassemble(object value) { return DeepCopy(value); } #endregion Methods } }
プレ>マッピング
<?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="DataLayer" namespace="NHibernate.Map"> <class name="NHibernate.Map.OrganizationUnit, DataLayer" table="`orgunit`"> <property name="HierarchyId" column="`ou_hid`" type="NHibernate.UserTypes.HierarchyId, DataLayer" /> ... </class> </hibernate-mapping>
プレ>HierarchyId を持つオブジェクト
namespace NHibernate.Map { using Microsoft.SqlServer.Types; public class OrganizationUnit { #region Fields private SqlHierarchyId _hierarchyId; ... #endregion Fields #region Properties public virtual SqlHierarchyId HierarchyId { get { return _hierarchyId; } set { _hierarchyId = value; } } ... #endregion Properties } }
プレ>