Linq-to-sql无法插入和更新时,这是一个触发器连接

问题描述:

最近我有一些linq-to-sql的问题。问题在于,当我们触发附加事件时,它“认为”插入和更新失败。 一个示例可以是一行,其中触发器被附加以将行更改时的“LastUpdated”冒号设置为当前时间。这将导致linq-to-sql认为更新或插入失败,但这只是一些时候,因为它有时会经过,我认为这是当sql服务器负载很重,因此不能在进行验证之前执行触发器,这只是猜测。 由于我的脚本只是一个更大的脚本的一部分,因此禁用触发器不是一种选择,所以我需要找到解决方案或重写我的程序。 有没有人遇到过这个问题并找到了解决方案,例如在插入后禁用验证?Linq-to-sql无法插入和更新时,这是一个触发器连接

触发器。

USE [cnhha] 
GO 
/****** Object: Trigger [dbo].[LastUpdated] Script Date: 05/12/2011 16:26:51 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER TRIGGER [dbo].[LastUpdated] ON [dbo].[CN_User] 
FOR INSERT, UPDATE 
AS 

update cn_user set lastupdated=getdate() where campusnetuserid in (select campusnetuserid from inserted) 
+0

您可能必须在测试环境中禁用触发器来验证确实是问题所在。是否可以从LINQ2SQL语句中删除触发器更改的字段,以便它不尝试验证? – n8wrl 2011-05-06 13:30:11

+0

什么类型的触发器。在更新之前或更新之后? – 2011-05-06 13:30:45

+0

你可以添加触发器看起来像什么吗? – DForck42 2011-05-11 15:36:23

你可能需要SET NOCOUNT ON在触发

除非我question "SET NOCOUNT ON usage"提到窄的情况下(SqlDataAdapter的),它最需要的客户端代码

您可以删除触发太多,如果你可以改变你的客户端更新使用DEFAULT关键字

update cn_user 
set col1 = this, col2 = that,..., 
    lastupdated= DEFAULT 
where ... 
+0

这里有很好的全面信息。 – arcain 2011-05-19 04:17:02

您的触发器是否通过SELECT语句返回任何数据?看到这个MSDN文章:CREATE TRIGGER

当触发火灾,结果 返回给调用应用程序, 就像使用存储过程。为了消除 其结果返回给 应用由于触发 射击,不包括任何选择 语句返回结果,或在触发器执行变量赋值 陈述 。 触发器 包含SELECT语句 返回结果给用户或 语句执行变量 分配需要特殊处理; 这些返回的结果将不得不 被写入 中的每个应用程序,允许修改触发器 表。如果在触发器中必须发生变量 分配,则 使用触发器开头的 处的SET NOCOUNT语句来消除返回任何结果集的 。

另外,如果您认为触发器在数据库引擎上造成沉重的负担,您是否考虑过使用Service Broker使其后处理异步?

如果您可以包含代表触发器的代码,它将帮助我们进一步诊断您遇到的问题。

+0

触发器没有选择,并且不返回任何日期。我在第一篇文章中添加了有关触发器的代码! – Androme 2011-05-12 14:24:36

您可以从SQL事件探查器的帮助中了解在此过程中发生的所有活动。您可以捕获每个事件的数据并将其保存到文件或表中。

+0

我们已经尝试过使用SQL分析器,并且linq-to-sql发送到数据库的所有命令都可以正常工作。这只是linq-to-sql本身,认为它失败 – Androme 2011-05-12 14:25:29

如果让触发器更新代码背后的属性值会混淆您的自定义实体验证逻辑,您可以完全避免触发器并直接设置实体上的LastUpdated属性,也可以不执行任何验证模式验证)LastUpdated属性的值?