NHibernateで作業中にTooManyRowsAffectedExceptionが発生しました。ここでTooManyRowsAffectedException with encrypted triggersのような別のバッチャーを注入するか、SET NOCOUNT ONを使用するようにデータベースのトリガーを変更して回避策を見ました。私はデータベースを変更したくない - それは100以上のテーブルがすべて一緒に関連しているので非常に複雑で、他のアプリケーションがそれを使用してから混乱したくない。なぜこの例外が発生するのか分かりません。私が行うのは、私がチェックする値がいくつかあるSampleオブジェクトがあり、その値が所定の基準に合う場合は、Sample.IsDone行を 'Y'に設定します(データベース内のブール値はすべてchar YまたはN)。コードはとてもシンプルです:トリガが別のテーブルを更新することをNHibernateに伝える方法?
IQueryable<Sample> samples = session.Query<Sample>().Where(s => s.Value == desiredValue);
foreach (Sample sample in samples)
{
sample.IsDone = 'Y';
session.Flush(); // Throws TooManyRowsAffectedException
}
session.Flush(); // Throws TooManyRowsAffectedException
Flushコールは、ループ内か外部に配置するかにかかわらずスローされます。私が間違っていることがあるのですか、それともデータベースの作成方法にのみ関連していますか? Flush()の前にサンプルでSaveOrUpdate()を呼び出そうとしましたが、何も変更されませんでした。私はこの例外を回避することができます知っているが、私は問題の原因を理解することを好むだろう。
注:例外として、実際の行数は2であり、期待値は1です。私は1行しか変更しないので、なぜ2行更新しますか?
ご協力いただきありがとうございます。
EDIT:
私はサンプルが更新されたとき(コンテナのサンプルが含まれている)コンテナテーブルの行を更新、データベース内のトリガーがありますので、その原因であることを見つけることができました。 NHibernateがこのトリガについて知って、適切な数の行が更新されることを期待するようにNHibernateを設定する方法はありますか?
私はFluent NHibernateを使用していませんが、NHibernateの設定でこれがどこに当てはまるのか分かりますか?私はどこでそれを書くべきか分かりません(私はClassMapを使用せず、それが何であるかを知っていませんし、SqlInsertなどの関数も見ていません)。 – Carl
私の答えを編集してください。うまくいけば、HBMを手作業で作成しているわけではありません。しかし、もしFluent NHibernateやNHibernate 3.0の新しい流暢なマッピング機能があなたにとって何ができるのかは間違いありません。 –
ありがとう。はい、私は手でHBMを作成していますが、今は問題ではありません(これは特に難しいとは思いません)。 – Carl