2009-09-04 11 views
3

hereと記述されているように、ビジネストランザクションパターンごとの会話パターンをWPFアプリケーションで実装したいと思います。残念ながら、このアプリケーションには、すべてのテーブルでSQL Server生成のIDキーを使用する既存の大規模なデータベースがあります。ビジネストランザクションとアイデンティティキーごとのNHibernate会話

NHibernateセッションに新しいオブジェクトを追加すると、IDキーがあれば挿入されます。 Fabioには、まだ作業単位全体を完了させていなくても、各要求の最後に現在のトランザクションをコミットするパターンがあります。

私が正しく理解している場合、これは、オブジェクトがデータベースに挿入され、作業ユニットを放棄しても削除されないことを意味します。したがって:

  • このパターンはIDキーと互換性がありませんか?
  • 合理的な回避策はありますか?
  • 私はこの場合に使用できるより良いパターンがありますか?

編集#1:

ファビオからのいくつかの追加のコメントはhereです。

編集#2:

さらに探る(...)は、持続(...)を保存に似ている方法が、混乱するのに十分なだけ違う私をリードしています。 hibernate FAQsから取られたこの文は興味深いです:

持続()メソッドは、また、それは トランザクション境界の外に呼び出された場合、それはINSERT 文を実行しないこと を保証します。これは、拡張されたセッション/永続コンテキスト で長時間実行される会話では役に立ちます です。

もちろん、トランザクション境界内で同じことが保証されていれば、より有用でしょうか?とにかく取引を使用していないという印象を受けました。

+0

私はSession.Persist()を試してみましたが、私はオープントランザクションを持っていませんでしたが、すぐに挿入を実行しました - それが意味することなら、少なくとも動作しません。 – Sam

答えて

1

1つの回避策 - 作業単位をコミットする準備が整うまで(おそらく、作業単位のクラス内の一時インスタンスの集合として)、ISession.Saveを保留にすることができます。

また、エンティティが既存のエンティティによって参照されていて、意味がある場合は、挿入をカスケードすることもできます。一貫して実行すると、集約ルートオブジェクトを明示的に挿入する必要があります。これは私がこの状況で通常使用するアプローチです。

関連する問題