2
NHibernate version: 3.3.2.

いくつかの操作を含む NHibernate トランザクションがあります。トランザクションの中間ステップの 1 つとして、Session.Save を介して自動インクリメント PK を使用して新しいエンティティ インスタンスを挿入しようとします。

場合によっては、違反した外部キ​​ー値が原因で挿入エラーが発生することがあります。ログを作成して無視するために例外をキャッチします。挿入が行われていないと仮定して、次の手順を実行します。これは機能要件であり、変更できません。パフォーマンス要件によると、挿入する前に値を検証することも許容できる解決策ではありません。

私の問題: 非永続エンティティが NH セッション キャッシュに追加されましたが、ID が空です。したがって、後で他のNH操作を実行すると、この例外が発生します。

NHibernate.AssertionFailure: null id in MyApp.MyPackage.MyClass entry (don't flush the Session after an exception occurs)

私の質問: この厄介な「ゾンビ」エンティティをセッションから外して、すべてのステップの最後にトランザクションを正常にコミットするにはどうすればよいですか?

Id が空であるため、削除できません。

私はそれを試してみましたが、次の例外が発生しました:

System.InvalidOperationException: cannot generate an EntityKey when id is null

Clear()トランザクションの途中であり、前後の手順を保持する必要があるため、現在のセッションもできません。

私が受け取った元の例外はやや混乱を招き、実際の問題が発生した場所とは別の場所でスローされました。このリンクは、何が起こっているのかを理解するための情報を私に与えてくれました: NHibernate - null id in entry (例外が発生した後にセッションをフラッシュしないでください)

4

2 に答える 2

0

残念なことに、zombie.discard() を「try/catch」でラップすることでこれを回避できました。これを行うと、厄介な「null id in your.object エントリ (例外が発生した後にセッションをフラッシュしないでください)」

私は汚いと感じます。

于 2013-08-06T02:36:25.223 に答える
0

NHibernate マニュアル、9.8によると。例外処理:

ISession が例外をスローした場合は、すぐにトランザクションをロールバックし、ISession.Close() を呼び出して、ISession インスタンスを破棄する必要があります。ISession の特定のメソッドは、セッションを一貫した状態のままにしません。

あなたの場合、トランザクション全体を再起動する必要があると思います。

于 2013-11-29T11:37:32.860 に答える