Сессия закрыта! - 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 - это моя реализация singleton, использующая FluentNHibernate для возврата объекта ISessionFactory.

В моем классе репозитория я пытаюсь использовать следующий синтаксис:

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 здесь. Я тоже использую WebSessionContext в своей реализации, однако не было предоставлено никакого решения, кроме написания собственного SessionManager. Требуется ли для простых операций CRUD настраиваемый провайдер сеанса помимо встроенных инструментов (например, WebSessionContext)?


person Alexis Abril    schedule 18.09.2009    source источник


Ответы (3)


Я не тестировал ваш код, но прочитал эту строку:

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();
}
person Jon Seigel    schedule 18.09.2009

У меня похожая ошибка. Оказывается, я был «новичком» в моем репозитории, вместо того, чтобы разрешить его в контейнере IOC.

person Tuan    schedule 07.06.2010

Использование следующего оператора отменяет или закрывает сеанс после каждого запроса:

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

Вместо этого используйте его без слова "использование" как:

ISession session = SessionFactory.Instance.GetCurrentSession()

Это сработало для меня.

person Ashutosh Mishra    schedule 31.08.2017