Вопрос

Я нашел статья из MSDN это описывает, как EF обрабатывает параллелизм при сохранении изменений:

По умолчанию [...] Службы объектов сохраняют объект изменения в базе данных без проверки на параллелизм.Для свойств, которые могут иметь высокую степень параллелизма, мы рекомендуем, чтобы свойство entity было определено на концептуальном уровне с атрибутом ConcurrencyMode="фиксированный"

У меня есть два вопроса:

  1. Не имея свойств в моей модели, где ConcurrencyMode="fixed", безопасно ли для меня предполагать , что если когда - либо OptimisticConcurrencyException выбрасывается при сохранении изменений, это происходит потому, что объект больше не существует в хранилище данных, т.е.оно было удалено другим пользователем, или я что-то упустил?

    Я представляю, как EF выполняет UPDATE-утверждение, которое выглядит примерно так, что, на мой взгляд, вызовет только OptimisticConcurrencyException будет выброшен, если Пользователь с ID = 1 не существует:

    UPDATE Person SET FirstName = 'John' AND LastName = 'Smith' WHERE ID = 1
    
  2. При использовании 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 для удаления, который не принимает эти значения параллелизма.

Надеюсь, это поможет

Алекс

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top