用SQLSERVER做表的触发器时,发现此时Nhibernate更新操作时会爆异常,搜了一下问题解决。
问题描述如下:
问题产生:使用Nhibernate执行更新操作(Store)一切正常,在对数据库表增加了触发器——作用:将当前更改记录的访问用户(suser_sname())及时间(getdate())写入被更改记录的特定字段——后,Nhibernate操作发生异常
异常信息:“SQL insert, update or delete failed (expected affected row count: 1, actual affected row count: 2). Possible causes: the row was modified or deleted by another user, or a trigger is reporting misleading row count.”
解决方案:在触发器脚本中添加如下语句——起始处(as 之后 begin之前)set nocount on;结尾处(end之后)set nocount off
原因分析:Nhibernate在对数据库执行更改操作时,会比较更改记录的数量与数据库返回的实际受影响记录数(也就是@@ROWCOUNT的返回值),如果两者不一致,就会引发上述异常。而让数据库返回的实际受影响记录数发生变化的原因,就是在触发器中执行了Update、Insert或Delete语句。而nocount开关的作用,就是让SQL Server在执行数据更改操作后不返回受影响记录数。只要在触发器脚本中执行数据库更改操作前打开nocount开关,就可以让Nhibernate得到正常的预期结果,进而消除此异常。
特别感谢:UNO
本文介绍了解决NHibernate更新操作时遇到的问题,当SQL Server表存在触发器记录更改信息时,NHibernate会因受影响行数不符而抛出异常。通过在触发器中设置nocount开关,可以避免这一问题。
4201

被折叠的 条评论
为什么被折叠?



