Подтвердить что ты не робот

Concurrency исключения в Entity Framework

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

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

4b9b3361

Ответ 1

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

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

См. также Объект framework 5.0 оптимизирует оптимизацию concurrency исключение?.

Ответ 2

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

Теперь переходим к разности.

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