Med Entity Framework kan du inte göra detta till en "atomär" operation. Du har stegen:
- Ladda entitet från databasen
- Ändra räknare i minnet
- Spara ändrad enhet i databasen
Mellan dessa steg kan en annan klient ladda entiteten från databasen som fortfarande har det gamla värdet.
Det bästa sättet att hantera denna situation är att använda optimistisk samtidighet . Det betyder i princip att ändringen i steg 3 inte kommer att sparas om räknaren inte längre är densamma som den var när du laddade enheten i steg 1. Istället får du ett undantag som du kan hantera genom att ladda om enheten och tillämpar ändringen igen.
Arbetsflödet skulle se ut så här:
- I
Work
enhetWordCount
egendom måste markeras som en samtidighetstoken (kommentarer eller Fluent API vid Code-First) - Ladda entitet från databasen
- Ändra räknare i minnet
- Ring
SaveChanges
i entry-catch
blockera och fånga undantag av typenDbUpdateConcurrencyException
- Om ett undantag inträffar, ladda om enheten i
catch
blockera från databasen, tillämpa ändringen igen och anropaSaveChanges
igen - Upprepa det sista steget tills inget undantag inträffar längre
I det här svaret
du kan hitta ett kodexempel för denna procedur (med DbContext
).