NHibernate TooManyRowsAffectedException

时间:2017-09-08 15:01:03

标签: sql-server nhibernate

我在刷新db更改时遇到此错误。我只更改Matricula属性。我之前尝试刷新更改,以确保没有任何待处理的事情,并且在行动中它什么都不做。

我接下来要做的是更改该属性,并在刷新更改后立即更改。  生成的SQL是正确的,但它表示只有1个应该受影响的212行。

[16:49:27,122] NHibernate.SQL - DEBUG: Batch commands:
command 0:UPDATE Ordenes_Bonos SET Matricula = @p0 WHERE IdOrden = @p1 AND 
IdBono = @p2;@p0 = '020012' [Type: String (4000:0:0)], @p1 = 115862 [Type: 
Int32 (0:0:0)], @p2 = 10 [Type: Int32 (0:0:0)]

[16:49:27,566] NHibernate.Event.Default.AbstractFlushingEventListener - 
ERROR: Could not synchronize database state with session
NHibernate.AdoNet.TooManyRowsAffectedException: Batch update returned 
unexpected row count from update; actual row count: 212; expected: 1

所以我接下来要做的是直接在数据库上检查相同的查询,以防由于触发器而导致更多行被更改(我不这么认为,但以防万一):

BEGIN TRANSACTION;
UPDATE Ordenes_Bonos
SET    Matricula = '020012'  
WHERE  IdOrden = '115862'
   AND IdBono = '10'

SELECT @@ROWCOUNT;
ROLLBACK;

该输出为1.

那么为什么NHibernate说这个UPDATE改变了212行?

1 个答案:

答案 0 :(得分:1)

您的问题是由于您说从执行语句中启动的触发器引起的。

触发器在执行语句的事务中运行,这是您的NHibernate更新。如果您没有显式启动事务,Nhibernate将在SQL中使用implicit transaction

因此,Nhiberate会将这些触发器更新视为其事务的一部分,并且会抛出您的错误。

所以你有两个选择。

  1. 使用set NOCOUNT ON更新所有触发器以抑制受影响的行数

  2. 删除了触发器并将它们移动到NHibernate中的EventListeners。