Отказ от ответственности: Я не эксперт по NHibernate, однако мы используем его с Fluent в предстоящем проекте, который использует SQL Server 2008 R2 и Иерархические идентификаторы. Ниже приведен код, который мы используем в настоящее время в нашей среде разработчиков и не полностью протестирован/уточнен. Я скопировал большую часть кода из другого места (извините, я потерял ссылку!)
Вам необходимо создать определенный пользователем тип, а затем использовать его в своих сопоставлениях. Отображение ниже Fluent, Im не знает, как это сделать, используя ActiveRecord, но я предполагаю, что он должен быть похож!
User Defined Type
namespace YourNamespace {
public class SqlHierarchyIdUserType : IUserType {
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) {
SqlHierarchyId hId = (SqlHierarchyId)value;
((IDataParameter)cmd.Parameters[index]).Value = hId.ToString();
}
}
}
public object DeepCopy(object value) {
if(value == null)
return null;
var sourceTarget = (SqlHierarchyId)value;
SqlHierarchyId copy = SqlHierarchyId.Parse(sourceTarget.ToString());
return copy;
}
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);
}
public SqlType[] SqlTypes {
get { return new[] { NHibernateUtil.String.SqlType }; }
}
public Type ReturnedType {
get { return typeof(SqlHierarchyId); }
}
public bool IsMutable {
get { return true; }
}
}
}
Fluent Mapping
Map(e => e.YourSqlHierarchyIdProperty)
.Column("YourSqlHierarchyIdFieldName")
.CustomType<SqlHierarchyIdUserType>();
Читая этот пост:
Castle ActiveRecord: Map to IUserType wihtin Class in C#
ActiveR ecord использует атрибут [Свойство] для сопоставления пользовательских типов. Так что для вас это будет выглядеть примерно так:
public class YourDataObject {
[Property(ColumnType="YourNamespace.SqlHierarchyIdUserType, YourNamespace")
public virtual SqlHierarchyId YourSqlHierarchyIdProperty;
}
Надеюсь, это поможет!
Спасибо за ответ Иглы.Этот проект был несколько назад для меня, поэтому я не могу сказать, будет ли это работать (хотя с первого взгляда это выглядит здорово). Если кто-то курант, что он работает, я буду отмечать его как ответ. – JasonCoder