Да. Один из запросов всегда будет успешным, а именно первый. Способ проверки параллелизма работает так, что EF добавляет предложение where в оператор обновления, задавая что-то вроде:
WHERE State = 3
Где значение - это то, что EF знал в последний разоколо. Если другой экземпляр контекста успешно обновил объект, например, теперь State
равен 4, то оператор обновления не может ничего сопоставить, и EF выдает DbUpdateConcurrencyException
. Если значение совпадает, тогда обновление проходит, как и ожидалось.
Таким образом, ваш блок catch должен реализовывать стратегию восстановления. Как правило, это будет получение последних значений из базы данных, а затем попытка выполнить повторную модификацию сущности оттуда, прежде чем пытаться снова выполнить обновление. Различные стратегии, которые вы можете использовать, а также способы их достижения, подробно описаны в документации.