Оптимистичный параллелизм в ADO.NET Entity Framework
-
10-07-2019 - |
Вопрос
Я нашел статья из MSDN это описывает, как EF обрабатывает параллелизм при сохранении изменений:
По умолчанию [...] Службы объектов сохраняют объект изменения в базе данных без проверки на параллелизм.Для свойств, которые могут иметь высокую степень параллелизма, мы рекомендуем, чтобы свойство entity было определено на концептуальном уровне с атрибутом ConcurrencyMode="фиксированный"
У меня есть два вопроса:
Не имея свойств в моей модели, где
ConcurrencyMode="fixed"
, безопасно ли для меня предполагать , что если когда - либоOptimisticConcurrencyException
выбрасывается при сохранении изменений, это происходит потому, что объект больше не существует в хранилище данных, т.е.оно было удалено другим пользователем, или я что-то упустил?Я представляю, как EF выполняет
UPDATE
-утверждение, которое выглядит примерно так, что, на мой взгляд, вызовет толькоOptimisticConcurrencyException
будет выброшен, если Пользователь с ID = 1 не существует:UPDATE Person SET FirstName = 'John' AND LastName = 'Smith' WHERE ID = 1
При использовании
ConcurrencyMode="fixed"
, проверяет ли EF параллелизм и при удалении объектов?Другими словами, будет ли EF когда-нибудь выполнятьDELETE
-оператор, который выглядит следующим образом (с большим количеством, чем просто первичный ключ вWHERE
-оговорка):DELETE FROM Person WHERE ID = 1 AND LastName = 'Doe'
Решение
Хороший вопрос.
(1) Да, но, к сожалению, это не совсем так просто.Поскольку EF (3.5) имеет независимую модель ассоциации, ассоциация также обрабатывается независимо, и даже если вы этого не сказали, она становится частью проверок параллелизма во время ОБНОВЛЕНИЙ и УДАЛЕНИЙ.
т. е.когда вы обновляете Пользователя, вы часто будете видеть обновления, которые выглядят следующим образом:
UPDATE Person SET Partner = NULL AND FirstName = 'John' AND LastName = 'Smith'
WHERE ID = 1 AND Partner = 2
т. е.Партнер - это столбец FK.
Все это изменится в версии 4.0, если вы будете использовать FK-ассоциации, как мы и ожидаем от большинства людей.
(2) При УДАЛЕНИИ проверяются все свойства ConcurrencyMode = 'fixed' во время удаления.Исключением является случай, когда у вас есть SPROC для удаления, который не принимает эти значения параллелизма.
Надеюсь, это поможет
Алекс