Entity Framework – Warum explizit den Entity-Status auf “Modified” setzen?

Die offizielle Dokumentation besagt, dass ich eine Entity modifizieren soll, die ein DbEntityEntry-Objekt aufruft und entweder mit den Property-functionen arbeitet, oder ich setze den Status auf “Modified”. Es verwendet das folgende Beispiel

Department dpt = context.Departments.FirstOrDefault(); DbEntityEntry entry = context.Entry(dpt); entry.State = EntityState.Modified; 

Ich verstehe den Zweck der 2. und 3. Aussage nicht. Wenn ich den Rahmen für eine Entität wie die erste Aussage frage und dann die POCO wie in modifiziere

 dpt.Name = "Blah" 

Wenn ich dann EF nach SaveChanges () frage, hat die Entity den Status MODIFIED (ich rate über Snapshot-Tracking, dies ist kein Proxy) und die Änderungen werden beibehalten, ohne dass der Status manuell gesetzt werden muss. Fehle ich hier etwas?

In Ihrem Szenario müssen Sie den Zustand tatsächlich nicht einstellen. Der Zweck der Änderungsverfolgung besteht darin, festzustellen, dass Sie einen Wert für die angefügte Entität geändert und in den geänderten Status versetzt haben. Das manuelle Festlegen des Status ist wichtig im Falle von getrennten Entitäten (Entitäten, die ohne Änderungsverfolgung geladen oder außerhalb des aktuellen Kontextes erstellt wurden).

Wie gesagt, in einem Szenario mit getrennten Entitäten kann es nützlich sein, den Status einer Entität auf Modified . Es wird ein Roundtrip in die database gespeichert, wenn Sie einfach die getrennte Entität anhängen, anstatt die Entität aus der database zu holen und sie zu ändern und zu speichern.

Aber es kann sehr gute Gründe geben, den Staat nicht auf Modified (und ich bin mir sicher, Ladislav war sich darüber im Klaren, aber ich möchte sie dennoch hier aufzeigen).

  1. Alle Felder im Datensatz werden aktualisiert, nicht nur die Änderungen. Es gibt viele Systeme, auf denen Updates geprüft werden. Das Aktualisieren aller Felder verursacht entweder große Unordnung oder erfordert, dass der Überwachungsmechanismus falsche Änderungen ausfiltert.

  2. Optimistische Nebenläufigkeit. Da alle Felder aktualisiert werden, kann dies zu mehr Konflikten als nötig führen. Wenn zwei Benutzer dieselben Datensätze gleichzeitig, aber nicht dieselben Felder aktualisieren, muss kein Konflikt auftreten. Wenn sie jedoch immer alle Felder aktualisieren, wird der letzte Benutzer immer versuchen, veraltete Daten zu schreiben. Dies verursacht bestenfalls eine optimistische Nebenläufigkeitsausnahme oder im schlimmsten Fall einen Datenverlust.

  3. Nutzlose Updates. Die Entität wird als geändert markiert, egal was passiert. Unveränderte Entitäten werden auch ein Update auslösen. Dies kann leicht passieren, wenn Bearbeitungsfenster geöffnet werden können, um Details zu sehen, und mit OK geschlossen werden.

Es ist also ein gutes Gleichgewicht. Reduzieren Sie Roundtrips oder reduzieren Sie die Redundanz.

Wie auch immer, die Alternative, den Status auf ” Modified ist (mithilfe der DbContext API):

 void UpdateDepartment(Department department) { var dpt = context.Departments.Find(department.Id); context.Entry(dpt).CurrentValues.SetValues(department); context.SaveChanges(); } 

CurrentValues.SetValues markiert einzelne Eigenschaften als Modified .