Heute habe ich eine alte Anwendung von EF 4.2 nach EF 4.3.1 migriert. In meiner App habe ich CodeFirst verwendet, aber nach der Migration funktioniert es nicht mehr und konnte keinen Grund dafür finden. Um ein anderes mögliches Problem zu beheben, entschied ich mich, eine kleine Konsolenanwendung zu erstellen, und ich verwendete den vom ADO-Team veröffentlichten Data Migration-Durchlauf:
Ich habe genau den Code des Blogs kopiert, aber anstatt korrekt zu funktionieren (DB erstellen, Schema erstellen und Blog einfügen), erhalte ich einige Fehler:
Conversion failed when converting datetime from character string.
"All dies ist in SQL Server 2005 Express.
Ich habe das gleiche mit SQL Compact versucht, aber das gleiche Ergebnis (der andere Fehler):
The format of the specified date or time datepart is not valid. [ String = 2012-04-19T13.21.04.364 ]
Ich denke in beiden Fällen liegt das Problem in der Zeile, die EF als erste Migration eingeben möchte:
%Vor%Offenbar das Format mit dem. ist falsch, zumindest in meinem Gebietsschema, sollte es sein mit:
Ist das ein Fehler oder was? Es hat immer mit anderen Datetime früher funktioniert.
UPDATE Ich habe versucht, es als explizite Migration auszuführen und die Migration mit dem gesetzten -verbose-Flag anzuwenden, und hier ist, was ich bekomme:
%Vor%Update 2 Ich installierte SQL Server Profiler und profilierte, was dort passiert. Ich habe alle Anweisungen einzeln über den Abfrageanalysator ausgeführt und der Fehler, der fehlschlägt, ist, wie bereits oben erwähnt, das Einfügen der Migration.
%Vor% Beim Ändern des Formats der Dataset-Zeichenfolge von 2012-04-23T14.16.59.038Z
nach 2012-04-23T14:16:59.038Z
ist der Befehl ausgeführt worden, also schätze ich irgendwie, dass EF die Datenzeit in einem Format sendet, das nicht mit meinem Gebietsschema kompatibel ist.
Danke Simone
Dank des ADO.NET-Teams war dies ein Fehler im Migrationscode. Anscheinend haben sie vergessen, InvariantCulture zu spezifizieren, wenn sie Code für ein DateTime-Feld erzeugen, also funktioniert es in EN locale, aber nicht in anderen locales.
Um dieses Problem zu beheben, indem Sie auf eine offizielle Korrektur warten, sollten Sie einen benutzerdefinierten SqlGenerator angeben, der die Methode Generate(DateTime defaultValue)
überschreibt:
Und geben Sie dann den neuen SqlGenerator in der Konfigurationsklasse an:
%Vor%Wenn Sie es nur in manuellen Migrationen verwenden möchten, genügt es, wenn Sie nur CodeFirst benötigen, müssen Sie die Konfiguration im Startup-Code der Anwendung oder im DbContext angeben.
%Vor%HTH
Tags und Links code-first-migrations entity-framework-4 ef-code-first sql-server-ce