by admin
23. January 2008 08:13
Manchmal ist ein Nhibernate wirklich verblüffend. Hier ein Beispiel: Eine in einem einfachen Test Szenario abgesetzte Abfrage bringt das gewünschte Ergebnis. Wird die gleiche Abfrage zum zweiten Mal ausgeführt gibt es folgendes:
SqlTypeException for a SqlDateTime overflow. SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.
Hmm – eine neuer Stern am Himmel der Programmiertechniken nennt sich „Google based programming“. Diesem Prinzip folgend wurde zur Lösung folgende Suchabfrage formuliert:
multiple nhibernate queries result in SqlDateTime overflow
Bingo, der erste Treffer, ein Blogpost von „James Gregory“ mit dem Titel „NHibernate and the SqlTypeException“, erklärt das Problem Haargenau:
Nach der ersten Abfrage bekommt NHibernate die Werte aus der Tabelle, die sich nicht mit den Werten des gerade abgeholten Objekts decken. Statt einem Null, hat die DateTime Property als Default den MinValue. Ergo muss ein Fehler vorliegen, den es gerade zu rücken gilt.
NHibernate setzt also eine update Statement ab, um die Datenbank abzugleichen. Dagegen sträubt sich der SQL-Server, der ein anderes Verständnis von einem Minimum Wert für eine DateTime Feld hat, nämlich „01/01/1753 00:00“ im Gegensatz zum .NET DateTime.MinValue von „00:00:00.0000000, January 1, 0001“. Boom ein Fehler.
Die Korrektur ist, die gemappte DateTime Property Nullable zu setzen (DateTime? ..), das korrekte Mapping not-null="false" reicht nicht.
Danke James Gregory :-)