Это что-то, что мне нужно проверить программно, существует ли сессия или нет?
Да, если вы хотите использовать текущий механизм сеанса для контроля времени жизни сеанса через несколько блоков приложений, вам необходимо открыть и привязать сессию к 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")