Pregunta

Esto está en un entorno de aplicación web:

Una solicitud inicial puede completarse con éxito, sin embargo, cualquier solicitud adicional devuelve una " La sesión está cerrada " respuesta del marco de 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 de singleton, usando FluentNHibernate para devolver un objeto ISessionFactory.

En mi clase de repositorio, intento usar 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 se llame como tal:

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

Sospecho que mi código de repositorio es el culpable, pero no estoy 100% seguro de la implementación real que debería usar.

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

¿Fue útil?

Solución

No he probado su código, pero al leer, esta línea:

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

está volcando su sesión después de que salga el bloque, y luego la sesión se descarta / no es válida la próxima vez.

Aquí está 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();
}

Otros consejos

Recibí un error similar. Resulta que estaba "nuevo" en mi repositorio en lugar de que mi contenedor IOC lo resolviera.

El uso de la siguiente declaración elimina o cierra la sesión después de cada consulta:

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

En su lugar, úselo sin el " utilizando " palabra como:

ISession session = SessionFactory.Instance.GetCurrentSession()

Esto funcionó para mí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top