2009-09-18 7 views
6

Il s'agit d'un environnement d'application Web:"La session est fermée!" - NHibernate

Une demande initiale peut aboutir, mais toute requête supplémentaire renvoie une réponse «Session is closed» de la structure NHibernate. J'utilise une approche HttpModule avec le code suivant:

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 est ma mise en œuvre singleton, en utilisant FluentNHibernate pour retourner un objet ISessionFactory.

Dans ma classe référentiel, je tente d'utiliser la syntaxe suivante:

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

Cela permet le code dans l'application à appeler en tant que tel:

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

Je soupçonne mon code référentiel est à blâmer, mais je ne suis pas sûr à 100% sur la mise en œuvre réelle que je devrais utiliser. J'ai trouvé un problème similaire sur SO here. Moi aussi j'utilise WebSessionContext dans ma mise en œuvre, cependant, aucune solution n'a été fournie autre que l'écriture d'un SessionManager personnalisé. Pour les opérations CRUD simples, un fournisseur de session personnalisé est-il requis en plus des outils intégrés (c.-à-d. WebSessionContext)?

Répondre

4

Je ne l'ai pas testé votre code, mais à la lecture, cette ligne:

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

est le dumping session après la sortie du bloc, puis la session est disposé/invalide la prochaine fois à travers.

Voici le modèle que nous utilisons dans nos applications:

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

j'ai eu une erreur semblable. Il s'avère que j'étais "nouveau" dans mon dépôt au lieu d'avoir mon conteneur IOC le résoudre.

0

Utilisation de l'instruction suivante dispose de ou ferme la session après chaque requête:

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

utiliser à la place sans le mot « utilisant » comme:

ISession session = SessionFactory.Instance.GetCurrentSession() 

Cela a fonctionné pour moi.

Questions connexes