2010-02-22 4 views
0

Каков наилучший способ сопоставления типа UInt32 с типом sql-server int с NHibernate.NHibernate - Как хранить UInt32 в базе данных

Значение - ширина/высота изображения, поэтому отрицательное значение здесь не имеет смысла.

Но, возможно, мне следует использовать int, потому что NHibenate не поддерживает неназначенные ints.

ответ

3

Вы можете сопоставить столбец с 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); 
    } 
} 
+0

Ошибка при преобразовании из типа Enum с типом «NullSafeSet»: в этом случае значение не может быть преобразовано в тип с нулевым значением. Использовать 'uint? u = null; if (value! = null) u = (uint) value; 'вместо – fmuecke

+0

Также 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

+0

@fmuecke: в этом случае 'Equals' всегда будет получать значения в коробке, поэтому' object.ReferenceEquals' всегда будет возвращать false, и они никогда не будут равны нулю. – Groo

2

Я опоздал на год, но поскольку у меня был тот же вопрос и я нашел другой ответ, я думал, что добавлю его. Кажется, проще. Возможно, у него есть недостаток, которого я еще не обнаружил.

Я использую NHibernate 3.0, Visual Studio 2005 и .NET 2.0.x.

Я нашел, что могу использовать класс UInt32 .NET и не включать атрибут type в hbm.xml.

// .NET 2.0 Property syntax 
public class MyClass 
{ 
    // NHibernate needs public virtual properties. 
    private UInt32 _Id; 
    public virtual UInt32 Id { get { return (_Id); } set { _Id = value; } } 
} 


// hbml.xml 
<class name ="MyClass"> 
    <id name="Id" /> 
</class> 


// SQL to create the table 
CREATE TABLE `PumpConnection` (
`Id` **INT**(10) **UNSIGNED** NOT NULL AUTO_INCREMENT, 
) 
+0

Вы пытались использовать 'sql-type' для генерации схемы? –

Смежные вопросы