Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Problèmes de Fluent NHibernate avec les valeurs de colonne DATE de SQL Server 2008

Désolé, je viens de réaliser que je devrais poster ceci en réponse à la question au lieu de simplement commenter... S'il vous plaît, ne riez pas du "nouveau !"

Grâce à d'autres discussions et tests, il semble que ce problème soit lié à l'utilisation par ADO.NET et NHibernate des colonnes DbType.Date pour MS SQL 2008 du type de données DATE. Si le code utilisait SqlDbType.Date au lieu de DbType.Date, aucun problème de ce type ne se produirait et tout fonctionnerait comme spécifié.

Bien que l'utilisation de DbType.Date puisse sembler plus "portable" pour d'autres types de bases de données, elle introduit ce problème, car ADO.NET DbType.Date a la restriction d'une valeur minimale de 1/1/1753.

Une solution de contournement à ce problème consiste à indiquer à NHibernate que le type de la colonne est un DATETIME2, qui prend également en charge les valeurs de date antérieures au 1/1/1753. Si le mappage NHibernate est :

<property name="TestDate" type="datetime2">
  <column name="TestDate" sql-type="date" />
</property>

Le code fonctionne comme prévu sans exception.

C'est dommage que NHibernate ne reconnaisse pas qu'il utilise le dialecte MsSql2008 et utilise les SqlDbTypes plutôt que les DbTypes, mais cette solution de contournement semble fonctionner pour le moment.

Pour plus d'informations sur les aspects ADO.NET, voir ADO.NET Insert Min Value into SQL Server 2008 Date column crashs . Merci à @Graham Bunce pour son aide.

J'espère que ces informations aideront tous ceux qui rencontreront ce problème à l'avenir.