Исключения параллелизма в Entity Framework

c# entity-framework entity-framework-6 optimistic-concurrency

Вопрос

При вызове SaveChanges / SaveChangesAsync в Entity Framework (CF, C #), если происходит конфликт изменений (например, значения были обновлены с момента последнего чтения), то какое из этих двух исключений DbUpdateConcurrencyException исключение DbUpdateConcurrencyException или исключение OptimisticConcurrencyException ?

И в чем разница между ними?

Принятый ответ

DbUpdateConcurrencyException - это особое исключение, созданное DbContext , так что это тот, который нужно поймать. Это исключение может быть вызвано базовым исключением OptimisticConcurrencyException , но если это так, это исключение завершается как внутреннее исключение.

Не все исключения для обновления вызваны параллелизмом, поэтому вам также нужно поймать DbUpdateException после DbUpdateConcurrencyException (потому что последний является подтипом DbUpdateException ).

См. Также Entity Framework 5.0 справляется с оптимистичным исключением параллелизма? ,


Популярные ответы

Вы получите OptimisticConcurrencyException . Посмотрите на это .

Теперь придет к разнице.

  • Исключение OptimisticConcurrencyException, возникающее при нарушении оптимистичного параллелизма, означает, что более одного perople меняются на один и тот же результат, и это вызовет проблему несинхронизации)
  • DbUpdateConcurrencyException :Exception, вызванное DbContext, когда ожидаемое поведение заключается в том, что SaveChanges для объекта приведет к обновлению базы данных, но на самом деле никаких строк в базе данных не было затронуто. Это показывает, что база данных обновляется одновременно, а токен параллелизма, который должен был совпадать, на самом деле не совпал. Записи состояний, на которые ссылается это исключение, не сериализуются из-за безопасности и доступа к записям состояния после того, как сериализация вернет значение null.



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему