J'ai un problème similaire à ces questions :
Fichiers de mapping NHibernate 2.* : comment définir le type DateTime nullable (DateTime ?) ?
NHibernate ne persiste pas les DateTime Dépassement de capacité SqlDateTime
J'utilise NHibernate 2.1.2 et FluentNhibernate 1.0.0.636. Avec NHibernate 2.x, la fonction nullable DateTime?
Le problème devrait être résolu et je ne devrais pas avoir à faire quoi que ce soit de spécial avec ma cartographie. En conséquence, toutes mes propriétés DateTime sont simplement définies comme suit :
public virtual DateTime? CreatedOn { get; set; }
Dans ma base de données (SQL2008), toutes les propriétés DateTime sont configurées pour autoriser les nullités. Mon fichier de configuration NHibernate est configuré pour utiliser le dialecte SQL2008 :
<property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>
NHibernate fonctionne bien pour tout ce qui n'inclut pas un DateTime. Pour référence, voici l'erreur exacte que je reçois :
> at
> NHibernate.AdoNet.SqlClientSqlCommandSet.ExecuteNonQuery()</StackTrace><ExceptionString>System.Data.SqlTypes.SqlTypeException:
> SqlDateTime overflow. Must be between
> 1/1/1753 12:00:00 AM and 12/31/9999
> 11:59:59 PM.
Si j'exécute SQL Profiler, je peux voir la dernière commande que NHibernate tente d'exécuter (cette déclaration était très longue, je l'ai donc tronquée) :
exec sp_executesql N'UPDATE Projects SET Job = @p0, CreatedOn = @p1, .. WHERE (Where Clause), @p0=219221, @p1=NULL
Si j'exécute cette déclaration comme une requête, SQL la persiste bien, sans se plaindre du tout !
Qu'est-ce qui se passe ?