Med Entity Framework kan du ikke gøre dette til en "atomisk" operation. Du har trinene:
- Indlæs entitet fra databasen
- Skift tæller i hukommelsen
- Gem ændret enhed i databasen
Ind imellem disse trin kan en anden klient indlæse entiteten fra databasen, som stadig har den gamle værdi.
Den bedste måde at håndtere denne situation på er at bruge optimistisk samtidighed . Det betyder grundlæggende, at ændringen i trin 3 ikke bliver gemt, hvis tælleren ikke længere er den samme, som den var, da du indlæste entiteten i trin 1. I stedet får du en undtagelse, som du kan håndtere ved at genindlæse entiteten og genanvender ændringen.
Arbejdsgangen ville se sådan ud:
- I
Work
entitetWordCount
egenskab skal markeres som et samtidighedstoken (annotationer eller Fluent API i tilfælde af Code-First) - Indlæs entitet fra databasen
- Skift tæller i hukommelsen
- Ring til
SaveChanges
i entry-catch
blokere og fange undtagelser af typenDbUpdateConcurrencyException
- Hvis der opstår en undtagelse, genindlæs entiteten i
catch
blokere fra databasen, anvend ændringen igen og kaldSaveChanges
igen - Gentag det sidste trin, indtil der ikke længere forekommer nogen undtagelse
I dette svar
du kan finde et kodeeksempel for denne procedure (ved at bruge DbContext
).