Параллелизм при удалении объекта в Entity Framework - PullRequest
3 голосов
/ 14 июля 2011

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

Пример:

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

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

...

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

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

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

Ответы [ 3 ]

5 голосов
/ 14 июля 2011

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

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

0 голосов
/ 07 сентября 2011

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

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

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

0 голосов
/ 15 июля 2011

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

...