Параллелизм при удалении объекта в Entity Framework

Я разрабатываю веб-приложение с использованием Entity Framework. Я загружаю список объектов и привязываю его к повторителю, чтобы показать сводку по всем элементам. Пользователь может щелкнуть значок редактирования или значок удаления для каждого элемента в репитере.

Пример:

Пункт 1 | Редактировать | Удалить

Пункт 2 | Редактировать | Удалить

...

Редактирование отлично работает при использовании столбца rowversion для параллелизма, поскольку запись загружается, а значения столбца ID и rowversion сохраняются в скрытых полях формы. Эти «исходные» значения можно будет использовать позже при обновлении.

Однако, если пользователь нажимает кнопку «Удалить» для записи, я загружаю объект из базы данных, вызываю DeleteObject (), а затем вызываю SaveChanges (). Проблема в том, что когда я загружаю запись, она получает последнее значение rowversion, поэтому любая проверка параллелизма становится бесполезной.

Как я могу гарантировать, что при удалении записи выполняется проверка параллелизма?


comment
Я не понимаю твоего вопроса. Зачем вам выполнять какую-либо проверку параллелизма при удалении записи?   -  person ZippyV    schedule 14.07.2011
comment
Например, предположим, что вы просматриваете записи, чтобы удалить те, которые не были отмечены как оплаченные. После того, как вы откроете список, войдет другой пользователь и пометит запись как оплаченную. На основании информации, которую вы видите (которая теперь устарела), вы решаете удалить эту запись. Вы нажимаете кнопку удаления, и теперь платная запись была удалена, потому что на вашем экране она отображается как неоплаченная. В этом случае проверка параллелизма предотвратит это.   -  person DCNYAM    schedule 14.07.2011


Ответы (3)


На самом деле вам не нужно загружать объект из базы данных, если вы хотите его удалить.

Вместо этого создайте ObjectContext, прикрепите свой ObjectToDelete к этому контексту с помощью Attach (), затем DeleteObject () и SaveChanges (). Таким образом, вы можете получить исключение, касающееся параллелизма.

person Andreas H.    schedule 14.07.2011

Прочитав ответ на этот вопрос, Я решил использовать следующий подход.

  1. Используйте скрытые поля формы для хранения идентификатора и значения версии строки.
  2. Когда пользователь нажимает кнопку удаления, загружает объект из базы данных. Этот объект содержит значение rowversion, которое может отличаться от того, что хранится в скрытом поле.
  3. Присвойте значение rowversion из скрытого поля соответствующему свойству объекта.
  4. Вызовите метод AcceptChanges () диспетчера состояний объекта для этого объекта. Это приводит к тому, что значение rowversion, которое я сохранил, принимается как «текущее» значение.
  5. Удалите объект и вызовите SaveChanges () в контексте объекта.

Поэтому сохраненное мной исходное значение версии строки передается в SQL при попытке удалить запись и сравнивается с текущим значением в строке. Если они не совпадают, возникает исключение OptimisticConcurrencyException.

person DCNYAM    schedule 07.09.2011

Подход, отличный от указанного Андреасом Х., заключался бы в использовании хранимых процедур для удаления. Таким образом, вы можете выполнять проверку и удаление параллелизма в сохраненной процедуре, вызывая исключение в случае нарушения.

person JustLoren    schedule 14.07.2011