Entity framework insert-update-problem!
Ich habe ein problem mit dem entity framework. Vor allem kann ich nicht tun, insert-oder update-operation.
Fehlermeldung:
An error occurred while updating the entries. See the inner exception for details.System.Data.SqlClient.SqlException (0x80131904): The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value.
The statement has been terminated.
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
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 method, DbAsyncResult result)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
at System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.Mapping.Update.Internal.DynamicUpdateCommand.Execute(UpdateTranslator translator, EntityConnection connection, Dictionary`2 identifierValues, List`1 generatedValues)
at System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter adapter)
Können Sie mir helfen?
Beispielcode:
ProductGroups group;
if (txtProductGroupName.Text.Trim() != null)
{
group = new ProductGroups();
group.ProductGroupName = txtProductGroupName.Text.Trim();
context.ProductGroups.AddObject(group);
context.SaveChanges();
context.AcceptAllChanges();
lblState.ForeColor = Color.Red;
lblState.Text = "Ürün grubu kaydedildi...";
}
else
{
lblState.ForeColor = Color.Red;
lblState.Text = "Ürün grubu ismini bos geçmeyiniz";
}
Den Produktgruppen Tabelle ist definiert mit 5 Spalten:
- [ProductGroupID] int
- [ProductGroupName] varchar(100)
- [ProductGroupComment] varchar(1000)
- [CreatedOn] datetime
- [DeletedOn] datetime
- kannst du Beispiel-code, fehlschlägt? Auch dies sollte Euch einen Hinweis geben: Die Konvertierung eines datetime2-Datentyps in einen datetime-Datentyp führte zu einer out-of-range-Wert.
- möglicherweise geben Sie ein DateTime.MinValue() irgendwo, und es ist nicht in der Auswahl für die Struktur der entity.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie nicht ausfüllen
CreatedOn
undDeletedOn
Daten in Ihren zusätzlichen Instanz der Gruppe. EF wahrscheinlich schickte Standard .NET Wert, 1/1/0001. Sie führte zu einer Ausnahme, weil SQL-min zulässiger Wert fürDATETIME
Spalte ist 1/1/1753. Entweder füllen Sie den Wert in Ihrem code, oder verwenden SieDATETIME2
in der Datenbank.Look in diesem post bitte. Es kann nützlich sein für Sie - Mithilfe der sql-Datentyp date und EF4.
Hinzufügen BenSwayne Antwort:
Wenn Sie aktualisiert sind Unternehmen nicht aus der Datenbank kommen, müssen Sie sagen, entity framework nicht aktualisieren, CreatedOn Eigenschaft. Um dies zu tun, aktualisieren Sie den code mit den folgenden:
Während der aktuellen Antworten, die erklären, warum dieser Fehler Auftritt, niemand hat vorgeschlagen, eine Lösung oder best practice.
Die richtige Antwort ist, sollten Sie entweder Ihre date-Felder null-Werte zulässt, die im Modell oder geben Sie einen Wert an, während alle Einsätze!
Gibt es keine Notwendigkeit für Sie zu nutzen, den DateTime2-Datentyp, das ist nur Mehraufwand und nicht das problem lösen. Und Sie wollen sicher nicht, dass server-generierte default-Werte für diese Felder.
Ich würde vorschlagen, dass CreatedOn sollte festgelegt werden, während der Einsätze und DeletedOn sollte null sein.
Eine nette Sache zu beachten ist, dass das entity framework DbContext bietet eine SaveChanges () - Methode, die überschrieben werden können, in Ihrem Kontext-Klasse. Sie können diese Methode verwenden, um abzufangen EF spart und einfügen von Daten, wie die audit-Felder. Ich habe ein Modell base-Klasse enthält alle der gemeinsamen audit-Daten wie CreatedOn, dass alle meine Modelle beerben. Dann kann ich aktualisieren Sie die audit-Daten für jeden Eintrag in meinem Kontext (EF 4.3 DbContext):