Search code examples
nhibernatenhibernate-mappinguint32

NHibernate - How to store UInt32 in database


What is the best way to map UInt32 type to sql-server int type with NHibernate.

The value is a picture width/height so negative value are not make sense here.

But maybe I should use int because NHibenate doesn't support unassigned ints.


Solution

  • You can map the column with an IUserType.

    <class name="UnsignedCounter">
        <property name="Count" type="mynamespace.UInt32Type, mydll"  />
    </class>
    

    And the IUserType which maps UInt32? and 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 );
        }
    }