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
WorkentitasWordCountproperti harus ditandai sebagai token konkurensi (anotasi atau Fluent API jika Code-First) - Muat entitas dari database
- Ubah penghitung di memori
- Hubungi
SaveChangesdalamtry-catchmemblokir dan menangkap pengecualian dari jenisDbUpdateConcurrencyException - Jika terjadi pengecualian, muat ulang entitas di
catchblokir dari database, terapkan perubahan lagi dan panggilSaveChangeslagi - Ulangi langkah terakhir sampai tidak ada lagi pengecualian
Dalam jawaban ini
Anda dapat menemukan contoh kode untuk prosedur ini (menggunakan DbContext ).