2014-01-31 2 views
-1

У меня есть проект VS 2010, из которого я создал exe и настроил запланированную задачу. Но всякий раз, когда задание выполняется я получаю сообщение об ошибке в файле NHibernate.cs говоря текущий сеанс является недействительнымОшибка выполнения задачи при запуске проекта VS 2010, использующего NHibernate

public static ISession GetCurrentSession() 
{ 
    return SessionFactory.GetCurrentSession(); 
} 

Как это преодолеть? Является ли это чем-то необходимым, чтобы проверить программно, существует ли сеанс или нет?

ответ

1

Это что-то, что мне нужно проверить программно, существует ли сессия или нет?

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

Кроме того, вам необходимо указать, какой тип CurrentSessionContext вы хотите использовать, NHibernate предоставляет различные варианты реализации по умолчанию, например. веб-сценарии или консольные приложения. Причина этого в том, что сеанс будет связан с разными типами состояний.

В веб-сценариях реализация использует System.Web.HttpContext.Current.Items. Это гарантирует, что сеанс сохранится с одним HTTP-запросом.

В консольных приложениях, а также в вашем сценарии вы используете контекст сеанса ThreadStatic. Это гарантирует, что для каждого потока есть один сеанс.

Для привязки сеанса к CurrentSessionContext вы должны открыть и привязать его (сеанс завод должен быть построен первый/раз, конечно.

var session = sessionFactory.OpenSession(); 
CurrentSessionContext.Bind(session); 

Теперь sessionFactory.GetCurrentSession(); вернет вам эту сессию.

Вы должны также закрыть и утилизировать сеанс всякий раз, когда ваша сфера заканчивается, например, ваш поток умирает или концы запроса (в веб-приложениях).

Вы можете настроить NHibernate использовать определенный контекст. Использование Fluently configura это выглядит так:

Fluently.Configure() 
    .... 
    .CurrentSessionContext("thread_static") 
1

Набор предоставленной информации (включая фрагмент кода) просто недостаточно, чтобы сказать - что именно не так. Несмотря на это, есть один очень распространенный подозревала:

  • веб-реализация используется в консоли приложения (без выполнения System.Web инфраструктуры на месте)

Проверьте установку и выполнение текущее сохранение сессии (Http.Context, Thread ...). Для того, чтобы получить более глубокое понимание, пожалуйста, начните с документацией:

2.3. Contextual Sessions

Экстракт:

Большинство приложений с использованием NHibernate нуждаются в некоторой форме «контекстных» сессий, где данная сессия является в действительности во всем объеме данного контекста. Однако во всех приложениях определение того, что представляет собой контекст, обычно отличается; и различные контексты определяют различные области применения понятия тока.

Начиная с версии 1.2, NHibernate добавил метод ISessionFactory.GetCurrentSession(). Обработка за ISessionFactory.GetCurrentSession() подключается. Был добавлен интерфейс расширения (NHibernate.Context.ICurrentSessionContext) и новый параметр конфигурации (hibernate.current_session_context_class), позволяющий подключаемость области и контекста определения текущих сеансов.

Пример в документации показывает пользовательскую реализацию сессии настойчивость в веб-среде - Chapter 1. Quickstart with IIS and Microsoft SQL Server

public static ISession GetCurrentSession() 
{ 
    HttpContext context = HttpContext.Current; 
    ISession currentSession = context.Items[CurrentSessionKey] as ISession; 

    if (currentSession == null) 
    { 
     currentSession = sessionFactory.OpenSession(); 
     context.Items[CurrentSessionKey] = currentSession; 
    } 

    return currentSession; 
} 

Т.е. в консольном приложении (представляющий одну операцию) мы можем поместить сеанс в какое-либо свойство экземпляра программы ... и использовать его во время выполнения.

Смежные вопросы