Mit Entity Framework können Sie dies nicht zu einer "atomaren" Operation machen. Sie haben die Schritte:
- Entität aus Datenbank laden
- Zähler im Speicher ändern
- Geänderte Entität in Datenbank speichern
Zwischen diesen Schritten kann ein anderer Client die Entität aus der Datenbank laden, die noch den alten Wert hat.
Der beste Weg, mit dieser Situation umzugehen, ist die Verwendung von optimistischer Parallelität . Dies bedeutet im Grunde, dass die Änderung in Schritt 3 nicht gespeichert wird, wenn der Zähler nicht mehr derselbe ist wie beim Laden der Entität in Schritt 1. Stattdessen erhalten Sie eine Ausnahme, die Sie durch erneutes Laden der Entität und behandeln können die Änderung erneut anwenden.
Der Arbeitsablauf würde wie folgt aussehen:
- In der
Work
Entität derWordCount
-Eigenschaft muss als Parallelitätstoken gekennzeichnet sein (Anmerkungen oder Fluent-API im Fall von Code-First) - Entität aus Datenbank laden
- Zähler im Speicher ändern
- Rufen Sie
SaveChanges
auf in einemtry-catch
Ausnahmen vom TypDbUpdateConcurrencyException
blockieren und abfangen - Wenn eine Ausnahme auftritt, laden Sie die Entität neu in den
catch
Block aus der Datenbank, wenden Sie die Änderung erneut an und rufen SieSaveChanges
auf wieder - Wiederholen Sie den letzten Schritt, bis keine Ausnahme mehr auftritt
In dieser Antwort
finden Sie ein Codebeispiel für dieses Verfahren (unter Verwendung von DbContext
).