it-swarm.com.de

'datetime2' Fehler bei Verwendung des Entitätsframeworks in VS 2010 .net 4.0

Diesen Fehler erhalten:

System.Data.SqlClient.SqlException: Die Konvertierung eines Datetime2-Datentyps in einen Datetime-Datentyp führte zu einem Wert außerhalb des gültigen Bereichs.

Meine Entitätsobjekte richten sich alle an den DB-Objekten aus.

Ich habe nur einen einzigen Hinweis auf diesen Fehler über Google gefunden:

Google-Ergebnis

Nachdem ich das hier gelesen habe, erinnere ich mich, dass wir did 2 Felder hinzufügten und dann das Entitätsmodell von VS 2010 aktualisierten. Ich sehe keine.

Alles was ich im Code mache, ist das Entitätsobjekt aufzufüllen und dann zu speichern. (Ich fülle auch die neuen Felder mit Code auf) Ich füllte das Datumsfeld mit DateTime.Now aus.

Der wichtige Teil des Codes ist folgender: ctx.SaveChanges(SaveOptions.AcceptAllChangesAfterSave);

Die Datenbank ist SQL Server 2008.

Gedanken?

Der Rest des Fehlers:

at System.Data.Mapping.Update.Internal.UpdateTranslator.Update (IEntityStateManager stateManager, IEntityAdapter-Adapter) at System.Data.EntityClient.EntityAdapter.Update (IEntityStateManager entityCache) at System.Data.Objects.ObjectContext.SaveChanges (Optionen für SaveOptions) at SafariAdmin.Site.WebServices.SpeciesPost.SaveOrUpdateSpecies (String sid, String fieldName, String authToken) in SpeciesPost.svc.cs: Zeile 58 bei SafariAdmin.TestHarness.Tests.Site.WebServices.SpeciesPostSVC_Tester.SaveNewSpecies () in SpeciesPostSVC_Tester.cs: Zeile 33 --SqlException at System.Data.SqlClient.SqlConnection.OnError (SqlException-Ausnahme, boolesche breakConnection) at System.Data.SqlClient.SqlInternalConnection.OnError (SqlException-Ausnahme, Boolean breakConnection) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning () at System.Data.SqlClient.TdsParser.Run (RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject) at System.Data.SqlClient.SqlDataReader.ConsumeMetaData () at System.Data.SqlClient.SqlDataReader.get_MetaData () at System.Data.SqlClient.SqlCommand.FinishExecuteReader (SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds (CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) at System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, runBehavior runBehavior, Boolean returnStream, String-Methode, DbAsyncResult-Ergebnis) at System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String-Methode) at System.Data.SqlClient.SqlCommand.ExecuteReader (Verhalten von CommandBehavior, String-Methode) at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader (Verhalten von CommandBehavior) at System.Data.Common.DbCommand.ExecuteReader (Verhalten von CommandBehavior) at System.Data.Mapping.Update.Internal.DynamicUpdateCommand.Execute (UpdateTranslator-Übersetzer, EntityConnection-Verbindung, Dictionary2 identifierValues, List1 generierteWerte) at System.Data.Mapping.Update.Internal.UpdateTranslator.Update (IEntityStateManager stateManager, IEntityAdapter-Adapter) 

60
KevinDeus

Das Entity Framework behandelt alle Datumsangaben als Datetime2. Wenn Ihre Datenfelder in der Datenbank Datetime sind, könnte dies ein Problem darstellen. Wir hatten hier das gleiche Problem, und aus dem, was wir gefunden haben, füllen wir alle Datumsfelder aus und ändern diese Der Datentyp sind die gängigsten Lösungen

64
Tejo

Wenn Sie Code First verwenden, müssen Sie die optionale DateTime-Eigenschaft als DateTime? oder Nullable<DateTime> deklarieren. Unset DateTime Objekte kann zu Problemen führen.

Wenn die Eigenschaft in der Datenbank nullfähig ist und ein Standard DateTime im Code (nicht DateTime?) vorhanden ist, sendet ADO.NET einen Einfügebefehl mit dem Datum 0001-01-01 (nicht NULL), aber der Mindestwert für SQL DateTime beträgt 01-01 verursacht einen Fehler. Wenn Ihre DateTime-Eigenschaft im Code nullfähig ist (z. B. DateTime? oder Nullable<DateTime>), versucht der Befehl insert, anstelle eines Datums außerhalb des zulässigen Bereichs einen NULL einzufügen.

49
stepanZ

Verwenden Sie dieses SQL-Skript, um alle Spalten von datetime in datetime2 zu konvertieren. Es werden alle Tabellen übersprungen, die 'Aspnet' enthalten.

DECLARE @SQL AS NVARCHAR(1024)
DECLARE @TBL AS NVARCHAR(255)
DECLARE @COL AS NVARCHAR(255)
DECLARE @NUL AS BIT

DECLARE CUR CURSOR FAST_FORWARD FOR
    SELECT  SCHEMA_NAME(t.schema_id)+'.'+t.name, c.name, c.is_nullable
    FROM    sys.tables AS t
    JOIN    sys.columns c ON t.object_id = c.object_id
    JOIN    information_schema.columns i ON i.TABLE_NAME = t.name 
                                        AND i.COLUMN_NAME = c.name
    WHERE   i.data_type = 'datetime' and t.name not like '%aspnet%'

    ORDER BY t.name, c.name

OPEN CUR
FETCH NEXT FROM CUR INTO @TBL, @COL, @NUL
WHILE @@FETCH_STATUS = 0
BEGIN
    SELECT @SQL = 'ALTER TABLE ' + @TBL 
        + ' ALTER COLUMN [' + @COL + '] datetime2' 
        + (CASE WHEN @NUL=1 THEN '' ELSE ' NOT' END) + ' NULL;'
    EXEC sp_executesql @SQL
    FETCH NEXT FROM CUR INTO @TBL, @COL, @NUL
END

CLOSE CUR;
DEALLOCATE CUR;

Für mich geht das!

13
Roman Pushkin

Eine andere mögliche Lösung besteht darin, den Typ der SQL-Spalte des Felds auf datetime2 zu setzen. dies kann mit fluentapi erfolgen.

Property(x => x.TheDateTimeField)
   .HasColumnType("datetime2");

Hinweis: Dies ist eine Lösung für SQL Server 2008 und höher, da datetime2 nicht für SQL Server 2005 oder niedriger verfügbar ist.

8
InsI

Ich hatte das gleiche Problem und löste es, indem ich das [Column(TypeName = "datetime2")]-Attribut in verwandten Eigenschaften stelle, wie im folgenden Beispiel: 

 [Column(TypeName = "datetime2")]
 public DateTime? PropertyName { get; set; }
7

Ich weiß, dass es eine alte Frage ist, aber da ich hier gegoogelt habe, könnte jemand anderes dasselbe tun; -) Für diejenigen, die von DateTime zu DateTime2 wechseln, ist (wie für SQL2005-Benutzer) keine Option In den meisten Fällen ist es sinnvoller, leere Felder mit etwas wie (DateTime)System.Data.SqlTypes.SqlDateTime.MinValue zu füllen.
und nicht mit DateTime.now, da es einfacher ist, ihn als "Pseudo-Null" -Wert zu erkennen (und, falls erforderlich, in eine echte Null in einer Teilklasse des Vaterobjekts konvertieren)

5
ale.com

Wenn Sie den Entity-Framework-Code zuerst verwenden, geben Sie ihn folgendermaßen an:

public Nullable<System.DateTime> LastLogin { get; set; }
3
JoshYates1980

Wir hatten das gleiche Problem. Dies war mit der mssql-Version verbunden.

Öffnen Sie Ihre edmx-Datei mit einem XML-Editor Diese Zeile finden Sie oben in Ihrer Datei

<Schema Namespace="XXXXX.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2008"

Ersetzen Sie 2008 durch 2005Speichern Sie Ihre Datei und kompilieren Sie das Projekt erneut.

Hoffe das hilft jemand anderem in der Zukunft.

Ich habe diese Lösung nur mit einem ersten Ansatz versucht.

2
pix

Gibt es in Ihrer Entität eine ModifiedTime-Eigenschaft, die nur auf der Datenbankseite aktualisiert wird? Wenn ja, müssen Sie DatabaseGeneratedOption.Computed (für EF CodeFirst) verwenden. Besuchen Sie auch diese https://stackoverflow.com/a/9508312/1317263

Vielen Dank.

2
eLVik

Was auch immer in eine datetime passt, passt in einen datetime2-Datentyp. Umgekehrt ist dies nicht der Fall. Sie können ein Datum von Januar 1500 in einem datetime2-Datentyp speichern, aber datetime geht nur bis 1753 zurück, eine datetime2-Spalte kann alle zurückkehren Weg zum Jahr 1. Ich würde das Min-Datum überprüfen, das Sie übergeben, und ob Ihre Tabellen Datetime2- oder Datetime-Datenspalten haben

1
SQLMenace

Stellen Sie sicher, dass keines der Felder, die nicht Null sind, in der Datenbank (datetime) beim Einfügen/Aktualisieren ausgelassen wird. Ich hatte den gleichen Fehler und beim Einfügen von Werten in diese Datetime-Felder wurde das Problem behoben. Dies tritt auf, wenn den Nicht-Null-Datetime-Feldern kein richtiger Wert zugewiesen wurde.

1
vidya

Nachdem ich versucht hatte, dieses Problem mehrere Tage zu lösen, verwendete ich DateTime? als Datentyp in meinem Modell mit Entity Framework Code-First anstelle von DateTime.

1
jaminyah

Ich hatte das gleiche Problem in meiner ASP.Net-MVC-Anwendung.

In meiner Anwendung gab es zwei Modellklassen mit DateTime-Eigenschaften.

bei der Untersuchung fiel mir auf, dass die DateTime-Eigenschaft eines Modells nullfähig war, d. h. um das Geburtsdatum als optionale Eigenschaft festzulegen

das andere Modell hatte die DateTime-Eigenschaft mit der erforderlichen Datenanmerkung (Fehler beim Speichern dieses Modells)

meine App ist zuerst Code, also habe ich das Problem durch Festlegen des Datentyps als DateTime2 behoben

[Column(TypeName="datetime2")] 

dann habe ich die Migration auf der Paket-Manager-Konsole ausgeführt.

1
Taha

Einfach . Setzen Sie zuerst den DateTime-Typ auf DateTime? . Damit können Sie mit dem DateTime-Typ mit Nullwert in der Datenbank arbeiten.

0
Ulisses Ottoni

Dies folgt aus der Antwort von stepanZ ... Ich habe diesen Fehler erhalten, wenn ich Entity Framework Code First mit AutoMapper verwende. 

Bei der Einrichtung von AutoMapping stehen uns createddt, updateddt, createdby und updatedby zur Verfügung, die in unserer Funktion public override int SaveChanges() automatisch gesetzt werden. Wenn Sie dies tun, müssen Sie sicherstellen, dass Sie diese Felder so einstellen, dass sie von AutoMapper ignoriert werden. Andernfalls wird die Datenbank für diese Felder mit null aktualisiert, wenn sie nicht von View bereitgestellt werden.

Mein Problem war, dass ich die Quelle und das Ziel falsch herum gesetzt hatte. Daher versuchte ich, die Felder zu ignorieren, wenn ViewModel eingestellt wurde, anstatt die Model-Einstellung vorzunehmen.

Das Mapping sah folgendermaßen aus, als ich diesen Fehler erhielt (Hinweis: Die cfg.CreateMap<Source, Destination>() in der zweiten Zeile ordnet das Model dem ViewModel zu und setzt die Ignore()).

cfg.CreateMap<EventViewModel, Event>();
cfg.CreateMap<Event, EventViewModel>()
    .ForMember(dest => dest.CreatedBy, opt => opt.Ignore())
    .ForMember(dest => dest.CreatedDt, opt => opt.Ignore())
    .ForMember(dest => dest.UpdatedBy, opt => opt.Ignore())
    .ForMember(dest => dest.UpdatedDt, opt => opt.Ignore());

Die Quelle und das Ziel sollten für ein Mapping von ViewModel nach Model ignoriert werden (Hinweis: Der folgende Code ist richtig, wenn die Ignore() für das Mapping von ViewModel auf Model steht.)

cfg.CreateMap<Event, EventViewModel>();
cfg.CreateMap<EventViewModel, Event>()
    .ForMember(dest => dest.CreatedBy, opt => opt.Ignore())
    .ForMember(dest => dest.CreatedDt, opt => opt.Ignore())
    .ForMember(dest => dest.UpdatedBy, opt => opt.Ignore())
    .ForMember(dest => dest.UpdatedDt, opt => opt.Ignore());
0
Gwasshoppa