Оптимистичный параллелизм в ADO.NET Entity Framework - PullRequest
7 голосов
/ 03 августа 2009

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

По умолчанию [...] Object Services сохраняет объект изменения в базе данных без проверка на параллелизм . За свойства, которые могут испытывать высокая степень параллелизма, мы рекомендовать, чтобы свойство объекта определяется в концептуальном слое с атрибут 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 Ответ

6 голосов
/ 04 августа 2009

Хороший вопрос.

(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) Для DELETE любые свойства ConcurrencyMode = 'fixed' проверяются во время удаления. Исключение составляют случаи, когда у вас есть SPROC для удаления, который не принимает эти значения параллелизма.

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

Alex

...