Вы можете сопоставить столбец с IUserType.
<class name="UnsignedCounter">
<property name="Count" type="mynamespace.UInt32Type, mydll" />
</class>
И IUserType, отображающая UInt32?
и UInt32
.
class UInt32Type : IUserType
{
public object NullSafeGet(System.Data.IDataReader rs, string[] names, object owner)
{
int? i = (int?) NHibernateUtil.Int32.NullSafeGet(rs, names[0]);
return (UInt32?) i;
}
public void NullSafeSet(System.Data.IDbCommand cmd, object value, int index)
{
UInt32? u = (UInt32?) value;
int? i = (Int32?) u;
NHibernateUtil.Int32.NullSafeSet(cmd, i, index);
}
public Type ReturnedType
{
get { return typeof(Nullable<UInt32>); }
}
public SqlType[] SqlTypes
{
get { return new SqlType[] { SqlTypeFactory.Int32 }; }
}
public object Assemble(object cached, object owner)
{
return cached;
}
public object DeepCopy(object value)
{
return value;
}
public object Disassemble(object value)
{
return value;
}
public int GetHashCode(object x)
{
return x.GetHashCode();
}
public bool IsMutable
{
get { return false; }
}
public object Replace(object original, object target, object owner)
{
return original;
}
public new bool Equals(object x, object y)
{
return x != null && x.Equals(y);
}
}
Ошибка при преобразовании из типа Enum с типом «NullSafeSet»: в этом случае значение не может быть преобразовано в тип с нулевым значением. Использовать 'uint? u = null; if (value! = null) u = (uint) value; 'вместо – fmuecke
Также Equals не работает должным образом. Рабочая версия может быть 'public new bool Equals (объект x, объект y) { if (object.ReferenceEquals (x, y)) { return true; } if (x == null || y == null) { return false; } return (uint) x == (uint) y; } '}' – fmuecke
@fmuecke: в этом случае 'Equals' всегда будет получать значения в коробке, поэтому' object.ReferenceEquals' всегда будет возвращать false, и они никогда не будут равны нулю. – Groo