Dengan Entity Framework Anda tidak dapat menjadikan ini sebagai operasi "atom". Anda memiliki langkah-langkahnya:
- Muat entitas dari database
- Ubah penghitung di memori
- Simpan entitas yang diubah ke database
Di antara langkah-langkah ini, klien lain dapat memuat entitas dari database yang masih memiliki nilai lama.
Cara terbaik untuk mengatasi situasi ini adalah dengan menggunakan konkurensi optimis . Ini pada dasarnya berarti bahwa perubahan pada langkah 3 tidak akan disimpan jika penghitung tidak lagi sama seperti saat Anda memuat entitas di langkah 1. Sebagai gantinya, Anda akan mendapatkan pengecualian yang dapat Anda tangani dengan memuat ulang entitas dan menerapkan kembali perubahan.
Alur kerjanya akan terlihat seperti ini:
- Dalam
Work
entitasWordCount
properti harus ditandai sebagai token konkurensi (anotasi atau Fluent API jika Code-First) - Muat entitas dari database
- Ubah penghitung di memori
- Hubungi
SaveChanges
dalamtry-catch
memblokir dan menangkap pengecualian dari jenisDbUpdateConcurrencyException
- Jika terjadi pengecualian, muat ulang entitas di
catch
blokir dari database, terapkan perubahan lagi dan panggilSaveChanges
lagi - Ulangi langkah terakhir sampai tidak ada lagi pengecualian
Dalam jawaban ini
Anda dapat menemukan contoh kode untuk prosedur ini (menggunakan DbContext
).