Question

Quelle est la meilleure façon de cartographier le type UInt32 type int sql-server avec NHibernate.

La valeur est une largeur image / hauteur si la valeur négative sont pas de sens ici.

Mais peut-être que je devrais utiliser int parce que NHibenate ne supporte pas ints sans affectation.

Était-ce utile?

La solution

Vous pouvez mapper la colonne avec un IUserType.

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

Et le IUserType qui associe UInt32? et 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 );
    }
}

Autres conseils

Je suis un an de retard, mais depuis que j'ai eu la même question et a trouvé une autre réponse que je pensais que je l'ajouter. Il semble plus simple. Peut-être qu'il a un défaut que je ne l'ai pas encore découvert.

J'utilise NHibernate 3.0, Visual Studio 2005 et .NET 2.0.x.

J'ai trouvé que je pouvais utiliser la classe UInt32 de .NET et ne pas inclure l'attribut type dans le 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,
)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top