【问题标题】:NHibernate TooManyRowsAffectedExceptionNHibernate TooManyRowsAffectedException
【发布时间】:2017-09-08 15:01:02
【问题描述】:

我在刷新对 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 说 212 行在 UPDATE 上发生了变化?

【问题讨论】:

  • 您是否在数据库中设置了可以从您的更新中启动的触发器?
  • 是的,有一些触发器可能会从该更新开始。但在那种情况下,我的 SQL 查询不应该这么说吗?

标签: sql-server nhibernate


【解决方案1】:

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

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

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

所以你有两个选择。

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

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

【讨论】:

  • 我不能选择这两种解决方案中的任何一种,因为我无法更改或删除触发器(我不是数据库管理员)。有没有办法忽略这一点?为什么如果我自己执行 SQL 语句,ROWCOUNT 只是 1?
猜你喜欢
  • 2020-12-02
  • 2011-01-24
  • 2010-11-24
  • 2011-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多