linq to sql SubmitChanges не запускает триггеры с несколькими InsertOnSubmit или DeleteOnSubmit - PullRequest
2 голосов
/ 11 января 2011

Я использую linq to sql и у меня определен триггер для обновления счетчиков в другой таблице, если строки удалены или добавлены из таблицы с триггером на нем. Если я вызываю один InsertOnSubmit или один DeleteOnSubmit, а затем вызываю SubmitChanges, срабатывает триггер. Если я вызываю более одного из методов InsertOnSubmit или DeleteOnSubmit, а затем вызываю SubmitChanges, триггер не срабатывает.

Кто-нибудь сталкивался с этим и кто-нибудь знает, как это исправить? Единственный обходной путь сейчас - это вызывать SubmitChanges после каждого InsertOnSubmit или DeleteOnSubmit ...

Бэкэнд базы данных - SQL Server 2008 стандарта R2, я использую C # 4.0, используя встроенную функциональность конструктора linq to sql.

Ответы [ 2 ]

2 голосов
/ 11 января 2011

Я надеюсь, что причина, по которой вы задаете вопрос, заключается в том, что вы знаете, что технически это поведение невозможно, поскольку L2S генерирует операторы вставки так же, как вы вручную или в хранимой процедуре:)

Вы уверены, что он не запускает триггер или запускает триггер только один раз для всех вставок? Я не смог смоделировать сценарий (забыл установить ssms на моем домашнем компьютере - хотел бы использовать его в основном для игр;)), но этот вопрос: Триггер SQL Server, который работает - срабатывает только один раз ( прочитайте ответ Пабло Санта-Круза) показывает, что триггер будет срабатывать только один раз для каждого оператора вставки. Поэтому, если есть один оператор вставки, который массово вставляет из всего набора строк, триггер срабатывает только один раз, а идентификатор inserted в триггере содержит все эти строки.

Если L2S делает что-то умное и спулирует вставки из временной таблицы или табличной переменной, то вы можете увидеть только одно выполнение триггера.

Присоедините Console.Out к свойству DataContext Log и изучите SQL, который генерируется при отправке, - затем вы можете скопировать его и выполнить вручную в SSMS для проверки поведения.

Кроме того, я провожу большую часть своей жизни, избегая триггеров - так что я не самый большой авторитет в их поведении - я склонен думать, что они ничего не делают, кроме как превращают мою жизнь в кровавое страдание (зная, что они служат очень полезная цель)!

Так что, извините, нет точного ответа - но, надеюсь, несколько указателей там.

1 голос
/ 11 января 2011

Очевидно, что LINQ to SQL достаточно умен, чтобы выполнять обновление вместо удаления, а затем вставку, если вы удаляете строку и затем повторно добавляете строку с тем же первичным ключом. Мой триггер был только для вставок и удалений и поэтому никогда не видел, чтобы обновление прошло. Я изменил триггер соответственно и теперь все работает!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...