Với Entity Framework, bạn không thể đặt đây là một hoạt động "nguyên tử". Bạn có các bước:
- Tải thực thể từ cơ sở dữ liệu
- Thay đổi bộ đếm trong bộ nhớ
- Lưu thực thể đã thay đổi vào cơ sở dữ liệu
Giữa các bước này, một ứng dụng khách khác có thể tải thực thể từ cơ sở dữ liệu vẫn có giá trị cũ.
Cách tốt nhất để đối phó với tình huống này là sử dụng đồng thời lạc quan . Về cơ bản, điều đó có nghĩa là thay đổi trong bước 3 sẽ không được lưu nếu bộ đếm không còn giống như khi bạn tải thực thể ở bước 1. Thay vào đó, bạn sẽ nhận được một ngoại lệ mà bạn có thể xử lý bằng cách tải lại thực thể và áp dụng lại thay đổi.
Quy trình làm việc sẽ giống như sau:
- Trong
Work
thực thểWordCount
thuộc tính phải được đánh dấu là mã thông báo đồng thời (chú thích hoặc API thông thạo trong trường hợp là Code-First) - Tải thực thể từ cơ sở dữ liệu
- Thay đổi bộ đếm trong bộ nhớ
- Gọi
SaveChanges
trong mộttry-catch
chặn và bắt các ngoại lệ của loạiDbUpdateConcurrencyException
- Nếu một ngoại lệ xảy ra, hãy tải lại thực thể trong
catch
chặn khỏi cơ sở dữ liệu, áp dụng lại thay đổi và gọiSaveChanges
một lần nữa - Lặp lại bước cuối cùng cho đến khi không có ngoại lệ nào xảy ra nữa
Trong câu trả lời này
bạn có thể tìm thấy một ví dụ mã cho quy trình này (sử dụng DbContext
).