2009-09-18 23 views
6

Dies ist in einer Webanwendungsumgebung:"Sitzung ist geschlossen!" - NHibernate

Eine erste Anfrage kann erfolgreich abgeschlossen werden, aber alle zusätzlichen Anfragen geben eine "Sitzung ist geschlossen" -Antwort vom NHibernate-Framework zurück. Ich bin mit einem Httpmodule Ansatz mit dem folgenden Code:

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 meine Singleton-Implementierung ist, mit FluentNHibernate ein ISessionFactory Objekt zurückzukehren.

In meiner Repository-Klasse, versuche ich, die folgende Syntax zu verwenden:

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

Dies ermöglicht Code in der Anwendung als solche genannt werden:

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

Ich habe den Verdacht, meinen Repository Code ist schuld, aber ich bin mir nicht 100% ig sicher, welche Implementierung ich eigentlich verwenden sollte.

Ich fand ein ähnliches Problem auf SO here. Ich verwende auch WebSessionContext in meiner Implementierung, jedoch wurde keine andere Lösung als das Schreiben eines benutzerdefinierten SessionManagers bereitgestellt. Ist für einfache CRUD-Vorgänge ein benutzerdefinierter Sitzungsanbieter erforderlich, der von den integrierten Tools (z. B. WebSessionContext) entfernt ist?

Antwort

4

Ich habe den Code nicht getestet, aber aus der Lektüre, diese Zeile:

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

wird die Sitzung nach dem Block beendet Dumping, und dann wird die Sitzung/ungültig auf der nächste Zeit durch angeordnet ist.

Hier ist das Modell, das wir in unseren Anwendungen verwenden:

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

ich einen ähnlichen Fehler bekam. Es stellte sich heraus, dass ich mein Repository "neu" eingerichtet hatte, anstatt dass mein IOC-Container es löste.

0

Verwendung der folgenden Anweisung verfügt ab oder schließt die Sitzung nach jeder Abfrage:

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

verwenden sie stattdessen ohne das „mit“ Wort als:

ISession session = SessionFactory.Instance.GetCurrentSession() 

Das ist für mich gearbeitet.

Verwandte Themen