2008-08-28 13 views
5

私はNHibernate(私の最初の大きなプロジェクト)とは新しいです。
私はObjectブロックまたはObjectオブジェクトのリストを取得するためにusingブロック内でISessionオブジェクトを作成し、コードブロックを終了した後にセッションが破棄されるという単純なデータアクセス方法を使用していました。NHibernateでセッションを管理する最も良い方法は?

しかし、これは遅延ロードが必要な状況では機能しません。
たとえば、Ordersのコレクションであるプロパティを持つCustomerオブジェクトがある場合、遅延ロードが試行されると、Hibernate例外が発生します。
誰かが別の方法を使用していますか?

答えて

6

セッション管理まで来ていません探しているどのような素晴らしいチュートリアル...のためのSummerOfNHibernate Webキャスト:

http://code.google.com/p/dot-net-reference-app/source/browse/trunk/src/Infrastructure/Impl/HybridSessionBuilder.cs

セッション要求ごと:

http://code.google.com/p/dot-net-reference-app/source/browse/trunk/src/Infrastructure/Impl/NHibernateSessionModule.cs

+0

数ヶ月後のちょっとしたメモです。私がまだ上記のアプローチを使用している間、ほとんどの場合、IOCツールを使って 'ISessions'と' ISessionFactory'を管理する人々がやっている面白い作業があります - StructureMapとFubuMvcをチェックしたいかもしれませんより多くの情報のためのプロジェクト。 –

+1

@Matt:城のNHibernate施設を見てください。何年も前からありました。http://www.castleproject.org/container/facilities/trunk/nhibernate/index.html –

+0

答えのリンクは古くなっているようです。 –

1

セッション全体を作業単位として開いてください。あなたのセッションの寿命が短すぎる場合は、セッションレベルのキャッシュ(これは重要です)を受けることはできません。いつでもデータベースへのラウンドトリップを防ぐことができますが、多くの時間を節約します。怠惰なローディングを利用することもできません。これは理解するために重要です。

セッションの有効期間が長すぎる場合は、他の問題が発生する可能性があります。

ウェブアプリケーションの場合は、http-request-session-per-httpパターンを使用しても問題ありません。基本的には、リクエストの開始時にセッションを開き、最後にフラッシュ/クローズするHttpModuleです。セッションをHttpContext.Itemsに格納することを忘れないでください。静的ではありません。 < ---あなたが対処したくないあらゆる種類の問題につながります。

作業単位の実装については、RhinoCommonsを参照することもできます。

+0

私はWebアプリケーションのセッション管理のこの方法の多くの例を見てきましたが、winformsで動作させることは別の話です。 Billy McCaffertyはベストを尽くしていますが、winformsでのフレームワークの使い方についてはアドバイスはしていません。具体的には、いつwinformsでトランザクションを開始し、フラッシュします。 –

2

チェックアウトあなたは、具体的ウェビソード5または6

関連する問題