Question

J'ai une propriété de type uint sur mon entité. Quelque chose comme:

public class Enity
{
   public uint Count {get;set;}
}

Lorsque j'essaie de conserver cela dans la base de données SQL Server 2005, j'obtiens une exception

  

Dialect ne prend pas en charge DbType.UInt32

Quel serait le moyen le plus simple de contourner ce problème? Je pourrais par exemple le stocker aussi longtemps dans la base de données. Je ne sais pas comment dire cela à NHibernate.

Était-ce utile?

La solution

La solution la plus propre, la plus officielle serait probablement d'écrire un type d'utilisateur.

Prenons un exemple, comme celui-ci et l’adaptez. Si vous avez plusieurs uint , il vaut la peine d'avoir un type d'utilisateur.

<property name="Prop" type="UIntUserType"/>

Autres conseils

Je n'ai pas essayé, donc vous ne savez pas si cela fonctionnera pour vous, mais vous pouvez essayer de créer votre propre dialecte et de l'enregistrer dans le fichier web.config / app.config

Classe de dialecte:

public class MyDialect:MsSql2005Dialect
{
    public MyDialect()
    {            
        RegisterColumnType(System.Data.DbType.UInt32, "bigint");            
    }
}

Web.config:

configuration>
 <configSections>
  <section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate" />
 </configSections>

                <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
  <session-factory>
   <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider, NHibernate</property>
   <property name="connection.connection_string">
    Server=127.0.0.1; Initial Catalog=thedatabase; Integrated Security=SSPI
   </property>
   <property name="dialect">MyDialect</property>
   <property name="current_session_context_class">managed_web</property>
  </session-factory>
 </hibernate-configuration>
    <!-- other app specific config follows -->

</configuration>
<property name="Prop" type="long"/>

Vous pouvez essayer d'ajouter une autre propriété privée "miroir".

public class Enity
{
   public uint Count {get;set;}

   private long CountAsLong 
   { 
     get { return Convert.ToInt64(Count); } 
     set { Count = Convert.ToUInt(value); }
   }
}

<property name="CountAsLong" type="long"/>

Bien sûr, vous ne devez le faire que si le mappage ne permet pas de le résoudre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top