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
WorkenhetWordCountegendom måste markeras som en samtidighetstoken (kommentarer eller Fluent API vid Code-First) - Ladda entitet från databasen
- Ändra räknare i minnet
- Ring
SaveChangesi entry-catchblockera och fånga undantag av typenDbUpdateConcurrencyException - Om ett undantag inträffar, ladda om enheten i
catchblockera från databasen, tillämpa ändringen igen och anropaSaveChangesigen - 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 ).