"Сессия закрыта!" - NHibernate - PullRequest
       18

"Сессия закрыта!" - NHibernate

6 голосов
/ 18 сентября 2009

Это в среде веб-приложения:

Первоначальный запрос может быть успешно завершен, однако любые дополнительные запросы возвращают ответ «Session is Closed» из среды 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 - моя одноэлементная реализация, использующая 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)?

Ответы [ 3 ]

4 голосов
/ 18 сентября 2009

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

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();
}
0 голосов
/ 31 августа 2017

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

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

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

ISession session = SessionFactory.Instance.GetCurrentSession()

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

0 голосов
/ 07 июня 2010

Я получил похожую ошибку. Оказалось, что я был "новым" в моем хранилище вместо того, чтобы мой контейнер IOC разрешал его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...