Descargo de responsabilidad: No soy un experto en NHibernate, sin embargo, lo estamos utilizando con Fluent en un próximo proyecto que utiliza SQL Server 2008 R2 y las identificaciones de jerarquía. El siguiente código es lo que estamos usando actualmente en nuestro entorno de desarrollo y no está totalmente probado/refinado. Copié la mayoría del código de otra parte (lo siento, perdí el enlace!)
Necesita crear un tipo definido por el usuario y luego usarlo en sus asignaciones. La asignación a continuación es Fluent, no sé cómo hacerlo usando ActiveRecord pero supongo que debería ser similar.
Definido por el usuario 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; }
}
}
}
Mapeo Fluido
Map(e => e.YourSqlHierarchyIdProperty)
.Column("YourSqlHierarchyIdFieldName")
.CustomType<SqlHierarchyIdUserType>();
La lectura de este mensaje:
Castle ActiveRecord: Map to IUserType wihtin Class in C#
activer ecord usa un atributo [Propiedad] para mapear tipos definidos por el usuario. Entonces para usted se vería algo como esto:
public class YourDataObject {
[Property(ColumnType="YourNamespace.SqlHierarchyIdUserType, YourNamespace")
public virtual SqlHierarchyId YourSqlHierarchyIdProperty;
}
Espero que ayude!
Gracias por la respuesta Needles.Este proyecto fue hace un tiempo para mí, así que no puedo decir si esto funcionará (aunque a primera vista parece sólido). Si alguien responde que funciona, lo marcaré como la respuesta. – JasonCoder