linq to sql SubmitChanges不使用多个InsertOnSubmit或DeleteOnSubmit触发触发器

时间:2011-01-10 23:01:34

标签: c# sql-server linq-to-sql

我正在使用linq to sql并定义了一个触发器来更新另一个表中的计数,如果从表中删除或添加行,并在其上添加触发器。如果我调用一个InsertOnSubmit或一个DeleteOnSubmit,然后调用SubmitChanges,触发器将触发。如果我调用InsertOnSubmit或DeleteOnSubmit中的多个,然后调用SubmitChanges,则触发器不会触发。

有没有人经历过这个,有没有人知道修复它的方法?现在唯一的解决方法是在每个InsertOnSubmit或DeleteOnSubmit之后调用SubmitChanges ......

数据库后端是sql server 2008标准r2,我使用内置的linq to sql designer功能运行C#4.0。

2 个答案:

答案 0 :(得分:2)

我希望您提出问题的原因是因为您知道技术上这种行为是不可能的,因为L2S生成插入语句就像您手动或在存储过程中一样:)

你确定它没有触发触发器,还是只触发一次所有插入的触发器?我无法对场景进行建模(忘记在家用电脑上安装ssms - 比如主要用于游戏;)但是这个问题:SQL Server Trigger that works - fires just once(阅读pablo santa cruz的答案)显示触发器每个插入语句只会触发一次。因此,如果有一个insert语句从整个行集大量插入,那么触发器只触发一次,触发器中的inserted标识符包含所有这些行。

如果L2S正在做一些聪明的事情,并从临时表或表变量中假脱机插入,那么你可能只看到一个触发器执行。

Console.Out附加到DataContext的Log属性并检查提交时生成的SQL - 然后您可以复制它并在SSMS中手动执行它以检查行为。

顺便说一句,我一生中大部分时间都在避免触发 - 所以我不是他们行为的最大权威 - 我倾向于认为他们什么都不做,只会让我的生活变成一种血腥的痛苦(同时知道他们的服务非常好有用的目的)!

所以,对不起,没有硬性答案 - 但希望有一些指示。

答案 1 :(得分:1)

显然LINQ to SQL足够智能,可以执行更新而不是删除,然后在删除行然后重新添加具有相同主键的行时进行插入。我的触发器仅用于插入和删除,因此从未看到更新通过。我已经相应地修改了触发器,现在一切正常!