Declinazione di responsabilità: non sono un esperto di NHibernate, tuttavia lo stiamo utilizzando con Fluent in un progetto imminente che utilizza SQL Server 2008 R2 e ID gerarchia. Il codice seguente è quello che stiamo utilizzando attualmente nel nostro ambiente di sviluppo e non è completamente testato/perfezionato. Ho copiato la maggior parte del codice da un'altra parte (mi dispiace aver perso il collegamento!)
È necessario creare un tipo definito dall'utente e quindi utilizzarlo nelle mappature. La mappatura che segue è Fluent, non so come farlo usando ActiveRecord ma immagino che dovrebbe essere simile!
definito dall'utente Tipo
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; }
}
}
}
perfetto Mapping
Map(e => e.YourSqlHierarchyIdProperty)
.Column("YourSqlHierarchyIdFieldName")
.CustomType<SqlHierarchyIdUserType>();
lettura di questo post:
Castle ActiveRecord: Map to IUserType wihtin Class in C#
ActiveR ecord usa un attributo [Proprietà] per mappare i Tipi definiti dall'utente. Quindi per te sarebbe simile a questa:
public class YourDataObject {
[Property(ColumnType="YourNamespace.SqlHierarchyIdUserType, YourNamespace")
public virtual SqlHierarchyId YourSqlHierarchyIdProperty;
}
Spero che ti aiuti!
Grazie per la risposta Needles.Questo progetto è stato un po 'fa per me quindi non posso dire se questo funzionerà (anche se a prima vista sembra valido). Se qualcuno lo rallegra, funzionerà come se fosse la risposta. – JasonCoder