2011-01-29 5 views
2

私は、ディスク上のファイルにバインドされたバイナリデータを保持するNHibernateマップクラスを持っています。ビジネスロジックは非常に単純です:オブジェクトがデータベースに格納されている場合、オブジェクトがDBからロードされると、ブロブが正しくオブジェクトID NHibernate.Event.IPostDeleteEventListenerがトランザクションとうまく機能しない

  • に一致するようにという名前のファイルに書き込まれ

    • 、ブロブは、ファイルの内容で満たされている
    • 唯一の問題は、オブジェクトがDBから削除された場合

    • 、ファイルも削除され

    は、私は3つの状況を処理するためにIPostDeleteEventListenerを使用されていることであればトランザクションは何らかの理由でSession.Delete()の後にロールバックされますが、ファイルはすでに削除されていますが、レコードはDBに保存されます。その結果、アプリケーションは削除されていないオブジェクトを(再)ロードしようとします。

    また、大きな問題ではなく、挿入後にトランザクションがキャンセルされると、ガベージファイルが取得されます。

    これらのファイルシステム操作を実行するにはどうすればいいですかトランザクションがコミットされているときのみ?

    [追加] MAYBE ...おそらく、回避策が見つかりました。 ITransactionインターフェイスは、インターフェイスを引数として受け入れるRegisterSynchronizationメソッドを公開します。 MAYBEは回避策です:トランザクションの完了後にのみファイルを格納/削除してください。もっと調べる必要がありますが、NHibernateイベントリスナーサブシステムから直接コミット/ロールバックするためのフックする方法はありません。ファイルシステムがトランザクションされておらず、「ポストコミット」イベント公開はありませんので、それは(上位層でIE)NHのイベントシステムの外にそれをを行う方が良いでしょう

  • +0

    こんにちは、上の任意の進捗状況この問題?私はnhibernateフォーラム[NH-2523]であなたの問題を見ましたが、それ以来進歩はなかったようです。 – user2126375

    答えて

    1

    +0

    Hmmm ....読みにくい... NH開発者がこれらの混乱を処理するためにコミット後のイベントを確実に実装する必要があることに同意しますか?私はデリゲート/ラムダに基づいていくつかのアイデアを持っています。とにかく、あなたはそれが役に立つと思うので、 –

    +1

    "NH開発者"はそれを実装しません。テストと一緒にパッチを提供し、合理的なケースを作るか、パッチを当てたバージョンを使用するだけです。 –

    +0

    私は間違った言葉を使ったと思います... "これはNH開発者に実装するために間違いなく提案されるべきことですか?"あなたのコメントに+1しても、とにかくレポートを提出しましたが、スキルと時間があっても、パッチに貢献するNHコアの知識はないと思っています:( –

    関連する問題