2017-09-08 6 views
0

DBへの変更をフラッシュ中にこのエラーが発生しました。私はMatriculaプロパティだけを変更しています。私は何もしていないことを確認するために前に変更をフラッシュしようとしました。NHibernate TooManyRowsAffectedException

私がする次のことは、そのプロパティを変更し、変更がフラッシュされた直後です。 生成されたSQLは正しいですが、212行は1つしかなくてはならない場合に影響します。

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

SELECT @@ROWCOUNT; 
ROLLBACK; 

[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 

だから私は次のことは(私は念のためにそうは思わないが)トリガが原因で変更されたので、多くの行があった場合、データベースに直接同じクエリをチェックしています

出力は1です。

なぜ、NHibernateは212行がそのUPDATEで変更されたと言っていますか?

+0

更新プログラムから起動されるDBにトリガ設定がありますか? – Fran

+0

はい、その更新プログラムから起動するトリガがあります。しかし、その場合私のSQLクエリはそう言ってはいけませんか? – Pinx0

答えて

0

問題は、実行中のステートメントから開始されたトリガーのために発生しています。

トリガーは、実行中のステートメント(あなたのNHibernateアップデート)のトランザクション内で実行されます。明示的にトランザクションを開始していない場合、NhibernateはSQLでimplicit transactionを使用します。

Nhiberateはそのトランザクションの一環としてこれらのトリガアップデートを見ており、あなたのエラーを投げています。

2つのオプションがあります。

  1. 更新

  2. の影響を受けた行の数を抑制するset NOCOUNT ON有するすべてのトリガーは、トリガーを除去し、NHibernateの中のEventListenerにそれらを移動させます。

+0

トリガを変更したり削除したりすることができないので、私はこれらの2つのソリューションのいずれにも出られません(私はデータベース管理者ではありません)。これを無視する方法はありませんか?なぜSQL文を実行すれば、ROWCOUNTは1にすぎませんか? – Pinx0