Отказ от ответственности: я не эксперт NHibernate, однако мы используем его вместе с Fluent в будущем проекте, который использует SQL Server 2008 R2 и идентификаторы иерархии. Код ниже - это то, что мы используем в настоящее время в нашей среде разработки и не полностью протестировано / уточнено. Я скопировал большую часть кода из другого места (извините, я потерял ссылку!)
Вам необходимо создать пользовательский тип, а затем использовать его в своих сопоставлениях. Приведенное ниже сопоставление свободно, я не знаю, как это сделать с помощью ActiveRecord, но я предполагаю, что это должно быть похоже!
Определяемый пользователем тип
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; }
}
}
}
Свободное отображение
Map(e => e.YourSqlHierarchyIdProperty)
.Column("YourSqlHierarchyIdFieldName")
.CustomType<SqlHierarchyIdUserType>();
Чтение этого поста:
Замок ActiveRecord: сопоставление IUserType с классом в C #
ActiveRecord использует атрибут [Property] для сопоставления пользовательских типов. Так что для вас это будет выглядеть примерно так:
public class YourDataObject {
[Property(ColumnType="YourNamespace.SqlHierarchyIdUserType, YourNamespace")
public virtual SqlHierarchyId YourSqlHierarchyIdProperty;
}
Надеюсь, это поможет!