Pregunta

¿Cuál es la mejor manera de mapear UINT32 Tipo a SQL-Server int Type con nHibernate?

El valor es un ancho/altura de la imagen, por lo que el valor negativo no tiene sentido aquí.

Pero tal vez debería usar INT porque Nhibenate no es compatible con INT no asignado.

¿Fue útil?

Solución

Puede mapear la columna con un IUSERTYPE.

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

Y el iusertype que mapea UInt32? y 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 );
    }
}

Otros consejos

Llego un año tarde, pero como tuve la misma pregunta y encontré una respuesta diferente, pensé que la agregaría. Parece más simple. Tal vez tiene un defecto que aún no he descubierto.

Estoy usando NHibernate 3.0, Visual Studio 2005 y .NET 2.0.X.

Descubrí que podría usar la clase UINT32 de .NET y no incluir el atributo de tipo en el 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,
)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top