(N)Hibernateでセッションをどのように最善に使うかを考えようとしています。私はC#のリモートオブジェクト(MarshalByRefObject)は、ASP.NETクライアントによって消費される取得します。 現在のところ、私のリモーティングクラスはコンストラクタで1つのSessionインスタンスを開き、それをすべてのトランザクションに使用します。これは良いアイデアですか? session.Dipose()が呼び出されるリモートオブジェクトのファイナライザが必要ですか?Hibernateセッション/トランザクション設計
各クライアント要求は、新しいトランザクションを開きます。私のデータベースへのアクセスは、一般的に次のようになります。
ITransaction transaction = this.session.BeginTransaction();
try {
// perfrom nhibernate query
transaction.Commit();
}
catch (Exception ex) {
transaction.Rollback();
this.session.Flush();
}
そして、検索されたデータベースオブジェクトをクライアントに返すことがよくあります。 これはこれを処理する有効な方法ですか?使用するブロックでトランザクションオブジェクトを使用するか、Dispose()を呼び出す必要がありますか?ロールバック後にsession.Flush()が必要ですか?
また、返されたコレクションをGridViewにバインドするときに問題が発生することがあります。特定のオブジェクトのバインディングプロパティが無効であることを示す例外がスローされます。これは、プロキシオブジェクトを返す休止状態に関連していますか?そして、収集されたオブジェクトは、1つのクエリ内で「実際の」オブジェクトとプロキシオブジェクトが混在した状態で休止状態になるのはなぜですか?
ありがとうございます!