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
WorkentitetWordCountegenskab 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
SaveChangesi entry-catchblokere og fange undtagelser af typenDbUpdateConcurrencyException - Hvis der opstår en undtagelse, genindlæs entiteten i
catchblokere fra databasen, anvend ændringen igen og kaldSaveChangesigen - 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 ).