2009-09-18 16 views
6

Esto es en un entorno de aplicación web:"¡La sesión está cerrada!" - NHibernate

Una solicitud inicial puede completarse con éxito, sin embargo, cualquier solicitud adicional devuelve una respuesta de "sesión cerrada" del marco NHibernate. Estoy usando un enfoque HttpModule con el siguiente código:

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 es mi implementación Singleton, utilizando FluentNHibernate para devolver un objeto ISessionFactory.

En mi clase de repositorio, intento utilizar la siguiente sintaxis:

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

Esto permite que el código de la aplicación que se llama como tal:

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

Tengo la sospecha de que mi código repositorio tiene la culpa, pero no estoy 100% seguro de la implementación real que debería estar usando.

Encontré un problema similar en SO here. Yo también estoy usando WebSessionContext en mi implementación, sin embargo, no se proporcionó ninguna solución aparte de escribir un SessionManager personalizado. Para operaciones simples de CRUD, ¿se requiere un proveedor de sesión personalizado además de las herramientas integradas (es decir, WebSessionContext)?

Respuesta

4

No he probado el código, pero a partir de la lectura, esta línea:

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

está realizando el vaciado de la sesión después de salir del bloque, y luego la sesión está dispuesto/no válida en la próxima vez a través.

Aquí es el modelo que estamos usando en nuestras aplicaciones:

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

tengo un error similar. Resulta que estaba "renovando" mi repositorio en lugar de tener que resolver mi contenedor de IOC.

0

Uso de la siguiente declaración dispone fuera o cierra la sesión después de cada consulta:

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

utilizar en su lugar sin el "uso" palabra como:

ISession session = SessionFactory.Instance.GetCurrentSession() 

Esto funcionó para mí.

Cuestiones relacionadas