Comment mapper uint dans NHibernate avec SQL Server 2005
-
11-07-2019 - |
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.
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.