| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > LINQ (Language-Integrated Query) > DeleteAllOnSubmit и триггер |
| Автор: Magnetic 23.6.2008, 15:51 | ||||||
Есть примерно такой код:
LINQ на базе пытается выполнить запрос на удаление записей, причем для каждой сущности выполняется свой запрос, в котором в предложении where поиск идет по всем колонкам таблицы. Приблизительный смысл запросов от LINQ при вызове метода SubmitChanges следующий:
И таких запросов несколько. Проблема вот в чем. Есть триггер на удаление. Он срабатывает после первого запроса на удаление, меняет lft, rght значения, из-за чего последующие запросы удаления не могут найти соответвующих записей. В результате метод SubmitChanges выбрасывает исключение со словом Conflict в названии и ни одна запись не удаляется. Можно ли LINQ указать, чтобы он удалял записи только по ID, а не по всем полям? Например, чтобы LINQ выполнял на базе запросы такого вида:
вместо указанного выше. |
| Автор: Idsa 23.6.2008, 18:55 |
| Magnetic, в ORM вообще туго с batch update и delete командами. Для LINQ есть http://www.aneyfamily.com/terryandann/post/2008/04/Batch-Updates-and-Deletes-with-LINQ-to-SQL.aspx. В конце статьи исходный код с методами расширения. |
| Автор: akizelokro 24.6.2008, 12:30 | ||||
Аналогично, я предполагаю, для удаления. Надо завершать перевод с введением в DLinq. Но у меня с временем напряг (я тут озадачился с переездом в другой город), поэтому и торможу |
| Автор: Magnetic 24.6.2008, 16:33 |
| Поиски в интернете привели к следующему результату. Можно наследоваться от DataContext, переписать SubmitChanges и в нем вызвать ExecuteCommand c запросом, сформированным вручную, извлекая id из всех сущностей идущих на удаление. Жаль, что в LINQ нет возможности указать, чтобы он формировал запросы на удаление и обновление с поиском только по праймари кей, ведь если есть праймари кей, то чаще всего при обновлении и удалении записей через ооп поиск по всем полям и не требуется. Придется делать лишнюю работу. Может есть решение проще? |
| Автор: Idsa 24.6.2008, 16:48 |
Вы ходили по ссылке, которую я указал выше? |
| Автор: PashaPash 24.6.2008, 17:13 |
| Самописные хранимые процедуры и поддержка batch операций это конечно круто. Но проблема легко решается мышой в дизайнере - сменой аттирибута UpdateCheck для лишних колонок с Always на Never или WhenChanged. Или, как вариант, введением поля с IsVersion=true. |
| Автор: Magnetic 24.6.2008, 17:35 |
| Idsa, посчитал, что реализовать решение, которо я нашел и рассказал в предыдущем посте будет проще реализовать, чем разобраться в предложенной статье, тем более на английском, но все равно спасибо за ответ. PashaPash, то что нужно. Спасибо большое! |