我在刷新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行?
答案 0 :(得分:1)
您的问题是由于您说从执行语句中启动的触发器引起的。
触发器在执行语句的事务中运行,这是您的NHibernate更新。如果您没有显式启动事务,Nhibernate将在SQL中使用implicit transaction。
因此,Nhiberate会将这些触发器更新视为其事务的一部分,并且会抛出您的错误。
所以你有两个选择。
使用set NOCOUNT ON
更新所有触发器以抑制受影响的行数
删除了触发器并将它们移动到NHibernate中的EventListeners。