2009-09-18 21 views
6

これはWebアプリケーション環境にあります。「セッションが終了しました!」 NHibernate

最初の要求は正常に完了できますが、追加の要求はNHibernateフレームワークから「セッションがクローズ」応答を返します。私は、次のコードでHttpModuleをのアプローチを使用しています:

public class MyHttpModule : IHttpModule 
{ 
    public void Init(HttpApplication context) 
    { 
     context.EndRequest += ApplicationEndRequest; 
     context.BeginRequest += ApplicationBeginRequest; 
    } 

    public void ApplicationBeginRequest(object sender, EventArgs e) 
    { 
     CurrentSessionContext.Bind(SessionFactory.Instance.OpenSession()); 
    } 

    public void ApplicationEndRequest(object sender, EventArgs e) 
    { 
     ISession currentSession = CurrentSessionContext.Unbind(
      SessionFactory.Instance); 

     currentSession.Dispose(); 
    } 

    public void Dispose() { } 
} 

SessionFactory.InstanceはISessionFactoryオブジェクトを返すようにFluentNHibernateを使用して、私のシングルトン実装です。

public class MyObjectRepository : IMyObjectRepository 
{ 
    public MyObject GetByID(int id) 
    { 
     using (ISession session = SessionFactory.Instance.GetCurrentSession()) 
      return session.Get<MyObject>(id); 
    } 
} 

これは、アプリケーションのコードのような呼び出すことができます:私のリポジトリクラスで

は、私は、次の構文を使用しようとする

IMyObjectRepository repo = new MyObjectRepository(); 
MyObject obj = repo.GetByID(1); 

私は疑い私のリポジトリのコードを持っています責任を負うことですが、実際に実装するには100%確実ではありません。

同様の問題がSO hereで見つかりました。私も実装でWebSessionContextを使用していますが、カスタムSessionManagerを作成する以外の方法はありませんでした。単純なCRUD操作では、組み込みのツール(WebSessionContextなど)とは別にカスタムセッションプロバイダが必要ですか?

答えて

4

私はあなたのコードをテストしていませんが、読んでから、この行:

using (ISession session = SessionFactory.Instance.GetCurrentSession())

はブロックが終了した後、あなたのセッションをダンプされ、その後、セッションが経由次回に/無効に配置されています。ここで

は、我々のアプリケーションで使用しているモデルです。

ISession session = null; 

try 
{ 
    // Creates a new session, or reconnects a disconnected session 
    session = AcquireCurrentSession(); 

    // Database operations go here 
} 
catch 
{ 
    session.Close(); 
    throw; 
} 
finally 
{ 
    session.Disconnect(); 
}
0

私は、同様のエラーを得ました。私は自分のリポジトリをIOCコンテナで解決するのではなく、新しい "新しい"ものだったことが分かります。次の文の

0

使用はオフに処分するか、すべてのクエリの後にセッションを閉じ:これは私のために働いた

ISession session = SessionFactory.Instance.GetCurrentSession() 

using (ISession session = SessionFactory.Instance.GetCurrentSession()) 

代わりとして「使用」言葉もなくそれを使用しています。

関連する問題