Я борюсь с DbUpdateConcurrencyException в отключенном сценарии, используя EF6 (Entity Framework 6) с БД Oracle.
В основном мой код выглядит так (просто):
//retrieve transfer object from db (with statusid = 2)
//do something
transfer.StatusId = 3;
using (TransferContext tc = new TransferContext())
{
tc.Entry(transfer).State = EntityState.Modified;
tc.SaveChanges();
}
EF регистрирует следующий SQL:
update "T_TRANSFER_SC"
set "STATUS_ID" = :p0
where (("ID" = :p1)
and ("STATUS_ID" = :p2))
-- :p0: '3' (Type = Decimal)
-- :p1: '1' (Type = Decimal)
-- :p2: '3' (Type = Decimal)
-- Completed in 3 ms with result: 0
И для идентификатора, и для свойства STATUS_ID установлено значение: Режим параллелизма = фиксированный .
Как видите, параметры p0 и p2 имеют значение 3, но p2 должно иметь значение 2 (по крайней мере, из моего понимания), которое является старым значением свойства.
Если я выполняю код, я получаю DbUpdateConcurrencyException исключение:
«Оператор хранения, вставки или удаления затронул неожиданное количество строк (0). Возможно, объекты были изменены или удалены с момента загрузки объектов. Информацию о понимании и обработке исключений оптимистичного параллелизма см. http://go.microsoft.com/fwlink/?LinkId=472540».
Исключение связано, потому что в базе данных нет записи с ID = 1 и STATUS_ID = 3 (запись в db имеет значения 1 и 2). Я не понимаю, почему EF не использует старое значение STATUS_ID в предложении Where.
Я что-то упускаю, или это всегда так при работе в разных контекстах (отключено)? И как мне это исправить?