Конфигурация NHibernate "current_session_context_class" возможные значения и описания - PullRequest
7 голосов
/ 19 августа 2011

У меня в настоящее время есть конфигурация Fluent NHibernate:

public class NHibernateConfig
{
    public static Configuration Configure()
    {
        var cfg = Fluently.Configure()
            .Database(Config.PersistenceConfiguration)
            .Mappings(m =>
                          {
                              m.FluentMappings.AddFromAssemblyOf<SomeAssembly>();
                              m.FluentMappings.Conventions.AddFromAssemblyOf<EnumConvention>();                              })
            .ExposeConfiguration(x => x.SetProperty("current_session_context_class", "thread_static"))
            .BuildConfiguration();
        return cfg;  

     }
}

Мой вопрос касается открытого свойства " current_session_context_class ".Я знаю два значения для этого: thread_static или web .Мой коллега указал на другое значение, которое является call .Есть ли известная документация для значений этого свойства?Если нет, есть ли хорошие описания для этих значений?Я часами искал в Google некоторые объяснения, но безрезультатный результат.

Ответы [ 2 ]

5 голосов
/ 01 февраля 2013

"managed_web", "call", "thread_static" и "web" являются возможными значениями. Настроен так в конфигурации nhibernate:

<property name="current_session_context_class">call</property>

Как только это настроено, вы можете использовать SessionFactory.GetCurrentSession (). Вы должны связать и отменить привязку сессии самостоятельно. Один пример реализации:

if (CallSessionContext.HasBind(_sessionFactory))
            {
                session = SessionFactory.GetCurrentSession();
            }
            else
            {
                session = SessionFactory.OpenSession();
                CallSessionContext.Bind(session);
            }

Вместо CallSessionContext вы также можете использовать ManagedWebSessionContext или ThreadStaticSessionContext.

ManagedWebSessionContext - Подходит для приложения Asp.Net. Сеанс привязан к текущему HttpContext (предоставляется как параметр при привязке).

ManagedWebSessionContext.Bind(HttpContext.Current,session)

ThreadStaticSessionContext - Сессия присоединена к текущему потоку (я не рекомендую использовать это, поскольку потоки продолжают резко переключаться, и ваш присоединенный сеанс может быть потерян).

CallSessionContext - Подходит для не веб-приложений. Сессия прикреплена к CallContext. Я могу ошибаться, но я представляю это как сессию, присоединенную к самому SessionFactory. Пока у вас есть одна SessionFactory для всего приложения, этот подход гарантирует, что вы никогда не получите параллельные активные сеансы.

5 голосов
/ 19 августа 2011

Вот моя попытка объяснить это (любые дополнительные входные данные приветствуются):

Разница между CallSessionContext, ThreadLocalSessionContext и ThreadStaticSessionContext

Существует раздел нав стандартной документации NH, но я не думаю, что они делают очень хорошую работу, объясняя это или приводя примеры того, как именно его использовать.Вот ссылка на документацию NH.

http://nhibernate.info/doc/nhibernate-reference/architecture.html#architecture-current-session

В StackOverflow есть несколько достойных статей о том, как вы могли бы использовать это:
Какой лучший подход к управлению сессиями NHibernateдля использования в многопоточном приложении службы Windows?
NHibernate.HibernateException: Сессия не привязана к текущему контексту

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