Entity Framework: "Die Anweisung zum Aktualisieren, Einfügen oder Löschen von Anweisungen hat eine unerwartete Anzahl von Zeilen (0) beeinflusst."

entity-framework

Frage

Ich verwende Entity Framework, um ein Rastersteuerelement aufzufüllen. Manchmal erhalte ich beim Aktualisieren folgende Fehlermeldung:

Die Anweisung zum Aktualisieren, Einfügen oder Löschen von Informationen hat eine unerwartete Anzahl von Zeilen (0) beeinflusst. Entitäten wurden möglicherweise geändert oder gelöscht, seit Entitäten geladen wurden. Aktualisieren Sie die ObjectStateManager-Einträge.

Ich kann nicht herausfinden, wie ich das reproduzieren kann. Aber es hat vielleicht etwas damit zu tun, wie nahe ich die Updates mache. Hat jemand das gesehen oder weiß jemand, worauf sich die Fehlermeldung bezieht?

Edit: Leider ist es mir nicht mehr frei, das Problem, das ich hier hatte, zu reproduzieren, da ich mich von diesem Projekt entfernte und mich nicht erinnere, ob ich irgendwann eine Lösung gefunden habe, ob ein anderer Entwickler das Problem gelöst habe oder ob ich es umgehen konnte. Daher kann ich keine Antworten annehmen.

Akzeptierte Antwort

Das ist ein Nebeneffekt einer Funktion namens Optimistic Concurrency.

Nicht ganz sicher, wie man es in Entity Framework ein- und ausschalten kann. Im Grunde sagt man Ihnen jedoch Folgendes: Wenn Sie die Daten aus der Datenbank geholt haben und wenn Sie Ihre Änderungen gespeichert haben, hat ein anderer die Daten geändert (was bedeutet, wenn Sie gegangen sind.) Zum Speichern wurden 0 Zeilen aktualisiert (). In SQL-Begriffen enthält die where Klausel ihrer update den ursprünglichen Wert jedes Felds in der Zeile. Wenn 0 Zeilen betroffen sind, weiß dies, dass etwas schief gelaufen ist.

Die Idee dahinter ist, dass Sie am Ende keine Änderung überschreiben, von der Ihre Anwendung nicht wusste, dass sie stattgefunden hat - es handelt sich im Grunde um eine kleine Sicherheitsmaßnahme, die .NET für alle Ihre Updates einleitet.

Wenn es konsistent ist, liegt die Wahrscheinlichkeit, dass es innerhalb Ihrer eigenen Logik geschieht (z. B. Sie aktualisieren die Daten selbst in einer anderen Methode zwischen select und update), aber es könnte sich einfach um eine Race-Bedingung zwischen zwei Anwendungen handeln.


Beliebte Antwort

Ich bin auf dieses Thema gestoßen und es wurde dadurch verursacht, dass das Feld ID (Schlüssel) der Entität nicht gesetzt wurde. Wenn der Kontext die Daten speichern konnte, konnte keine ID = 0 gefunden werden. Stellen Sie sicher, dass in Ihrer Aktualisierungsanweisung ein Haltepunkt eingefügt wird, und überprüfen Sie, ob die ID der Entität festgelegt wurde.

Aus Paul Belloras Kommentar

Ich hatte genau dieses Problem, weil ich vergessen hatte, die verborgene ID-Eingabe in die .cshtml-Bearbeitungsseite aufzunehmen



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum