2010-12-09 4 views
5

Je vais avoir un problème similaire à ces questions:NHibernate 2.1.2 jeter exception débordement DateTime null

NHibernate 2.* mapping files: how to define nullable DateTime type (DateTime?)?

NHibernate won't persist DateTime SqlDateTime overflow

J'utilise NHibernate 2.1.2 et FluentNhibernate 1.0.0.636 . Avec NHibernate 2.x le problème nullable DateTime? devrait être réparé et je ne devrais pas avoir à faire quelque chose de spécial avec ma cartographie. En conséquence, toutes mes propriétés DateTime sont simplement définies comme ceci:

public virtual DateTime? CreatedOn { get; set; } 

Dans ma base de données (SQL2008), toutes les propriétés DateTime sont définies pour permettre nul. J'ai mon NHibernate configuration du fichier de configuration pour utiliser le dialecte SQL2008:

<property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property> 

NHibernate fonctionne bien pour tout ce qui ne comprend pas 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 je lance SQL Profiler, je peux voir la dernière commande que NHibernate tente d'exécuter (ce qui était une très longue déclaration, donc je l'ai tronqué il):

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 persiste, il très bien, ne se plaint pas du tout!

Que se passe-t-il?

Répondre

0

Je ne sais pas pourquoi, mais cela fonctionne here. Contrairement à l'exemple dans le lien, les miens sont DateTime? donc .... Je ne sais pas pourquoi cela fonctionne, mais c'est le cas.

+0

Un horodatage? fonctionne car il permet à DateTime d'être null.Si une date-heure n'est pas-nullable (juste DateTime), il est instancié à la valeur min, qui est 1/1/0001. –

1

Vos propriétés DateTime sont probablement définies sur DateTime.MinValue (1/1/0001) au lieu de null ou sur une valeur dans la plage valide pour une colonne DateTime.

0

J'ai eu ce même problème. Au début, je pensais que je l'ai corrigé en passant mon type sql d'une date nullable à un datetime nullable. Cependant, c'était un mirage. La cause première était une mise à jour en cascade sur une autre table nouvellement ajoutée.

Cela aurait été rapidement résolu si tout le monde (mais surtout MS) a jeté plus d'erreurs descriptives. C'est la vie.