Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DeleteAllOnSubmit и триггер 
V
    Опции темы
Magnetic
Дата 23.6.2008, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 11.11.2006

Репутация: нет
Всего: 1



Есть примерно такой код:
Код

this.db.DeleteAllOnSubmit(itemsList);
this.db.SubmitChanges();

LINQ на базе пытается выполнить запрос на удаление записей, причем для каждой сущности выполняется свой запрос, в котором в предложении where поиск идет по всем колонкам таблицы. Приблизительный смысл запросов от LINQ при вызове метода SubmitChanges следующий:
Код

delete from category where id=1, name='name', lft='lft', rght='rhgt'

И таких запросов несколько.
Проблема вот в чем. Есть триггер на удаление. Он срабатывает после первого запроса на удаление, меняет lft, rght значения, из-за чего последующие запросы удаления не могут найти соответвующих записей. В результате метод SubmitChanges выбрасывает исключение со словом Conflict в названии и ни одна запись не удаляется. 
Можно ли LINQ указать, чтобы он удалял записи только по ID, а не по всем полям? Например, чтобы LINQ выполнял на базе запросы такого вида:
Код

delete from category where id=1

вместо указанного выше.
--------------------
Dude, where's my car?
PM MAIL   Вверх
Idsa
Дата 23.6.2008, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 5
Всего: 62



Magnetic, в ORM вообще туго с batch update и delete командами. Для LINQ есть workaround. В конце статьи исходный код с методами расширения.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
akizelokro
Дата 24.6.2008, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: нет
Всего: 5



Цитата

You can use the stored procedure instead of the normal auto-generated update command by defining a method on your strongly-typed DataContext. Even if the DataContext class is being auto-generated by the DLinq code generation tool, you can still specify these methods in a partial class of your own. 
Код

public partial class Northwind : DataContext
{
    ...
    [UpdateMethod]
    public void OnProductUpdate(Product original, Product current) {
  // Execute the stored procedure for UnitsInStock update
  if (original.UnitsInStock != current.UnitsInStock) {
    int rowCount = this.ExecuteCommand(
    "exec UpdateProductStock " +
    "@id={0}, @originalUnits={1}, @decrement={2}",
    original.ProductID,
    original.UnitsInStock,
    (original.UnitsInStock - current.UnitsInStock)
    );
    if (rowCount < 1)
    throw new OptimisticConcurrencyException();
  }
  ...
    }
}




Аналогично, я предполагаю, для удаления.
Надо завершать перевод с введением в DLinq. Но у меня с временем напряг (я тут озадачился с переездом в другой город), поэтому и торможу


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
Idsa
Дата 24.6.2008, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 5
Всего: 62



akizelokro, Вы уверены, что Ваш метод решает проблему? Что-то мне подсказывает, что он сгенерирует примерно тот запрос, который не устраивает Magnetic:
Цитата(Magnetic @  23.6.2008,  19:51 Найти цитируемый пост)
delete from category where id=1, name='name', lft='lft', rght='rhgt'

(только с update).


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Magnetic
Дата 24.6.2008, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 11.11.2006

Репутация: нет
Всего: 1



Поиски в интернете привели к следующему результату. Можно наследоваться от DataContext, переписать SubmitChanges и в нем вызвать ExecuteCommand c запросом, сформированным вручную, извлекая id из всех сущностей идущих на удаление. Жаль, что в LINQ нет возможности указать, чтобы он формировал запросы на удаление и обновление с поиском только по праймари кей, ведь если есть праймари кей, то чаще всего при обновлении и удалении записей через ооп поиск по всем полям и не требуется. Придется делать лишнюю работу. Может есть решение проще?

Это сообщение отредактировал(а) Magnetic - 24.6.2008, 16:34
--------------------
Dude, where's my car?
PM MAIL   Вверх
Idsa
Дата 24.6.2008, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 5
Всего: 62



Цитата(Magnetic @  24.6.2008,  20:33 Найти цитируемый пост)
Может есть решение проще?

Вы ходили по ссылке, которую я указал выше?


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
PashaPash
Дата 24.6.2008, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 4
Всего: 49



Самописные хранимые процедуры и поддержка batch операций это конечно круто. Но проблема легко решается мышой в дизайнере - сменой аттирибута UpdateCheck для лишних колонок с Always на Never или WhenChanged. Или, как вариант, введением поля с IsVersion=true.


--------------------
PM MAIL WWW   Вверх
Magnetic
Дата 24.6.2008, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 11.11.2006

Репутация: нет
Всего: 1



Idsa, посчитал, что реализовать решение, которо я нашел и рассказал в предыдущем посте будет проще реализовать, чем разобраться в предложенной статье, тем более на английском, но все равно спасибо за ответ.

PashaPash, то что нужно. Спасибо большое!

--------------------
Dude, where's my car?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | LINQ (Language-Integrated Query) | Следующая тема »


 




[ Время генерации скрипта: 0.0707 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.