Ich habe den folgenden Code in meinem HomeController:
public ActionResult Edit(int id)
{
var ArticleToEdit = (from m in _db.ArticleSet where m.storyId == id select m).First();
return View(ArticleToEdit);
}
[ValidateInput(false)]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Article ArticleToEdit)
{
var originalArticle = (from m in _db.ArticleSet where m.storyId == ArticleToEdit.storyId select m).First();
if (!ModelState.IsValid)
return View(originalArticle);
_db.ApplyPropertyChanges(originalArticle.EntityKey.EntitySetName, ArticleToEdit);
_db.SaveChanges();
return RedirectToAction("Index");
}
Und dies ist die Ansicht für die Edit-Methode:
<% using (Html.BeginForm()) {%>
<fieldset>
<legend>Fields</legend>
<p>
<label for="headline">Headline</label>
<%= Html.TextBox("headline") %>
</p>
<p>
<label for="story">Story <span>( HTML Allowed )</span></label>
<%= Html.TextArea("story") %>
</p>
<p>
<label for="image">Image URL</label>
<%= Html.TextBox("image") %>
</p>
<p>
<input type="submit" value="Post" />
</p>
</fieldset>
<% } %>
Wenn ich auf die Schaltfläche "Senden" klicke, wird folgende Fehlermeldung angezeigt: {"The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value.\r\nThe statement has been terminated."}
Irgendwelche Ideen, wo das Problem liegt? Ich gehe davon aus, dass die Bearbeitungsmethode versucht, den in der Datenbank veröffentlichten Wert auf den bearbeiteten Wert zu aktualisieren, aber aus irgendeinem Grund gefällt es ihm nicht ... Obwohl ich nicht verstehe, warum das Datum betroffen ist, da es in der nicht erwähnt wird Controller-Methode zum Bearbeiten?
asp.net-mvc
Cameron
quelle
quelle
modelBuilder.Entity<WorldInfo>().Property(d => d.CurrentTime).HasColumnType("datetime2");
Antworten:
Das Problem besteht darin, dass Sie ein Modellobjekt verwenden
ApplyPropertyChanges
, das nur mit Daten im Formular (Überschrift, Story und Bild) gefüllt wurde.ApplyPropertyChanges
Wendet Änderungen auf alle Eigenschaften des Objekts an, einschließlich Ihrer nicht initialisiertenDateTime
Objekte, die auf 0001-01-01 festgelegt sind und außerhalb des Bereichs von SQL Server liegenDATETIME
.Anstatt zu verwenden
ApplyPropertyChanges
, würde ich vorschlagen, das zu ändernde Objekt abzurufen, die spezifischen Felder zu ändern, die Ihr Formular bearbeitet, und das Objekt mit diesen Änderungen zu speichern. Auf diese Weise werden nur geänderte Felder geändert. Alternativ können Sie versteckte Eingaben auf Ihrer Seite mit den anderen ausgefüllten Feldern platzieren, aber das wäre bei gleichzeitigen Änderungen nicht sehr freundlich.Aktualisieren:
Hier ist ein ungetestetes Beispiel für die Aktualisierung einiger Felder Ihres Objekts (dies setzt voraus, dass Sie LINQ to SQL verwenden):
quelle
modifiedDate
der Name Ihrer Immobilie ist)story.modifiedDate = DateTime.Now;
Bit meinem aktuellen Code hinzuzufügen ? Vielen DankDies ist ein häufiger Fehler, mit dem Benutzer bei der Verwendung von Entity Framework konfrontiert sind. Dies tritt auf, wenn die Entität, die der zu speichernden Tabelle zugeordnet ist, ein obligatorisches Datum / Uhrzeit-Feld hat und Sie es nicht mit einem bestimmten Wert festlegen.
Das Standardobjekt datetime wird mit dem Wert von erstellt
01/01/1000
und anstelle von null verwendet. Dies wird an die Datums- / Uhrzeitspalte gesendet, die Datumswerte von nun1753-01-01 00:00:00
an, jedoch nicht vorher, enthalten kann, was zu einer Ausnahme außerhalb des Bereichs führt.Dieser Fehler kann behoben werden, indem entweder das Datenbankfeld so geändert wird, dass es null akzeptiert, oder indem das Feld mit einem Wert initialisiert wird.
quelle
Msdn
Antwort: Ich nehme an, Sie versuchen,
DateTime
mit dem Wert '0001/1/1' zu speichern . Setzen Sie einfach den Haltepunkt und debuggen Sie ihn. Wenn ja, ersetzen Sie ihnDateTime
durchnull
das normale Datum oder legen Sie es fest.quelle
Dieser machte mich verrückt. Ich wollte vermeiden, eine nullbare Datumszeit (
DateTime?
) zu verwenden. Ich hatte auch nicht die Möglichkeit, den datetime2-Typ von SQL 2008 zu verwenden (modelBuilder.Entity<MyEntity>().Property(e => e.MyDateColumn).HasColumnType("datetime2");
).Ich entschied mich schließlich für Folgendes:
quelle
Sie können dieses Problem auch beheben, indem Sie es zum Modell hinzufügen (Entity Framework-Version> = 5).
quelle
Wenn Sie eine Spalte haben, die datetime ist und null zulässt, wird dieser Fehler angezeigt. Ich empfehle, einen Wert festzulegen, der vor .SaveChanges () an das Objekt übergeben wird.
quelle
Ich habe diesen Fehler erhalten, nachdem ich mein Modell (Code zuerst) wie folgt geändert habe:
zu
Vorhandene Zeilen mit dem Nullwert in DateCreated haben diesen Fehler verursacht. Daher musste ich die SQL UPDATE-Anweisung manuell verwenden, um das Feld mit einem Standardwert zu initialisieren.
Eine andere Lösung könnte die Angabe des Standardwerts für die Datei sein.
quelle
In meinem Fall habe ich im Initialisierer der Klasse, die ich in der Datenbanktabelle verwendet habe, keinen Standardwert für meine DateTime-Eigenschaft festgelegt, was zu dem in der Antwort von @Andrew Orsich erläuterten Problem führte. Also habe ich die Eigenschaft einfach auf null gesetzt. Oder ich hätte es auch DateTime.Now im Konstruktor geben können. Hoffe es hilft jemandem.
quelle
Es sieht so aus, als würden Sie das Entity Framework verwenden. Meine Lösung bestand darin, alle datetime-Spalten auf datetime2 umzustellen und datetime2 für alle neuen Spalten zu verwenden. Mit anderen Worten, EF sollte standardmäßig datetime2 verwenden. Fügen Sie dies der OnModelCreating-Methode in Ihrem Kontext hinzu:
Das wird alle DateTime und DateTime bekommen? Eigenschaften für alle Entitäten in Ihrem Modell.
quelle
Ich hatte das gleiche Problem, leider habe ich zwei DateTime-Eigenschaften in meinem Modell und eine DateTime-Eigenschaft ist null, bevor ich SaveChanges ausführe.
Stellen Sie daher sicher, dass Ihr Modell den DateTime-Wert hat, bevor Sie Änderungen speichern, oder machen Sie es nullwertfähig, um Fehler zu vermeiden:
Damit ist mein Problem gelöst. Stellen Sie sicher, dass Ihr Modelldatum korrekt ist, bevor Sie in der Datenbank bleiben:
quelle
Wenn Sie die Entity Framework-Version> = 5 verwenden und die Annotation [DatabaseGenerated (DatabaseGeneratedOption.Computed)] auf Ihre DateTime-Eigenschaften Ihrer Klasse anwenden, kann der Trigger der Datenbanktabelle Daten für die Datensatzerstellung und Datensatzaktualisierung eingeben, ohne dies zu verursachen Ihr Entity Framework-Code zum Würgen.
Dies ähnelt der 6. Antwort, die von Dongolo Jeno geschrieben und von Gille Q herausgegeben wurde.
quelle
Wenn Sie keinen Teil des Codes kennen, in dem ein Fehler aufgetreten ist, können Sie die "schlechte" SQL-Ausführung mit dem in mssql integrierten SQL-Profiler profilieren.
Ein schlechter datetime-Parameter zeigt ungefähr Folgendes an:
quelle
Dieses Problem tritt normalerweise auf, wenn Sie versuchen, eine Entität zu aktualisieren. Zum Beispiel haben Sie eine Entität , die ein Feld mit dem Namen enthält ,
DateCreated
die ist [Erforderlich] und wenn Sie Datensatz einfügen, wird kein Fehler zurückgegeben , aber wenn Sie aktualisieren möchten , dass bestimmte Entität, die Sie erhalten dieHier ist die Lösung:
In Ihrer Bearbeitungsansicht, dh
edit.cshtml
für MVC-Benutzer, müssen SieDateCreated
lediglich ein ausgeblendetes Formularfeld für Ihr direkt unter dem ausgeblendeten Feld für den Primärschlüssel der Bearbeitungsdaten hinzufügen .Beispiel:
Wenn Sie dies zu Ihrer Bearbeitungsansicht hinzufügen, wird dieser Fehler niemals auftreten, wie ich Ihnen versichere.
quelle
Sie müssen den Nullwert für Ihre Datumsvariable aktivieren:
quelle
Versuchen Sie, Ihre Eigenschaft auf Null zu setzen.
Hat für mich gearbeitet.
quelle
Wenn Sie Zugriff auf die Datenbank haben, können Sie den DB-Spaltentyp von datetime in datetime2 (7) ändern. Es wird weiterhin ein datetime-Objekt gesendet und es wird gespeichert
quelle
Das Modell sollte eine nullbare Datumszeit haben. Die zuvor vorgeschlagene Methode zum Abrufen des zu ändernden Objekts sollte anstelle von ApplyPropertyChanges verwendet werden. In meinem Fall hatte ich diese Methode, um mein Objekt zu speichern:
Und dann im Dienst rufe ich ab mit:
Der vollständige Servicecode lautet wie folgt:
quelle
[Gelöst] In Entity Framework Code Zuerst (mein Fall) wird nur geändert
DateTime
,DateTime?
um mein Problem zu lösen.quelle
Fehler: Die Konvertierung eines Datetime2-Datentyps in einen Datetime-Datentyp führte zu einem Wert außerhalb des Bereichs.
Dieser Fehler trat aufgrund von auf nicht einen beliebigen Wert gegen einen NOT NULL Datumsspalte in SQL DB mit EF Zuweisung und wurde durch die Zuordnung der gleichen aufgelöst.
Hoffe das hilft!
quelle
Ich habe dieses Problem beim Erstellen meiner Klassen aus dem Database First-Ansatz. Mit einfach Convert.DateTime (dateCausingProblem) gelöst. Versuchen Sie immer, Werte vor dem Übergeben zu konvertieren. Sie werden vor unerwarteten Werten bewahrt.
quelle
Sie müssen das Eingabeformat Ihres Datumsfelds an das erforderliche Entitätsformat anpassen, das JJJJ / MM / TT lautet
quelle