пытается реализовать сеанс для каждого веб-запроса, не настроен текущий контекст сеанса

Как я сказал в заголовке, я хочу реализовать сеанс для каждого веб-запроса. Мой провайдер сеанса настроен следующим образом (меня не интересует изменение этой конфигурации).

    public class SessionProvider
    {
        public static SessionProvider Instance { get; private set; }
        private static ISessionFactory _SessionFactory;

        static SessionProvider()
        {
            var provider = new SessionProvider();
            provider.Initialize();
            Instance = provider;
        }

        private SessionProvider()
        {

        }

        private void Initialize()
        {
            string csStringName = "ConnectionString";
            var cfg = Fluently.Configure()
                ....ommiting mappings and db conf.
                .ExposeConfiguration(c => c.SetProperty("current_session_context_class", "web"))
                .BuildConfiguration();
            _SessionFactory = cfg.BuildSessionFactory();    
        }

        public ISession OpenSession()
        {
            return _SessionFactory.OpenSession();
        }

        public ISession GetCurrentSession()
        {
            return _SessionFactory.GetCurrentSession();
        }
    }

Внутри Global.asax.cs у меня есть следующий код, связанный с сеансом для каждого веб-запроса.

private static ISessionFactory SessionFactory { get; set; }

    protected void Application_Start()
    {
        SessionFactory = MyDomain.SessionProvider.Instance.OpenSession().SessionFactory;

        AreaRegistration.RegisterAllAreas();

        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);

    }

    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        var session = SessionFactory.OpenSession();
        CurrentSessionContext.Bind(session);
    }

    protected void Application_EndRequest(object sender, EventArgs e)
    {
        var session = CurrentSessionContext.Unbind(SessionFactory);
        session.Dispose();
    }

При отладке моего веб-приложения я получаю сообщение об ошибке: Текущий контекст сеанса не настроен. ErrorMessage ссылается на строку global.asax CurrentSessionContext.Bind (session);

Обновлено Добавлено .ExposeConfiguration(c => c.SetProperty("current_session_context_class", "web")), и теперь у меня появляется сообщение об ошибке при получении данных из моего контроллера, например, это Сообщение об ошибке: Сессия закрыта! Имя объекта: «ISession».

Код контроллера:

using (ISession session = SessionProvider.Instance.GetCurrentSession())
            {
                using (ITransaction transaction = session.BeginTransaction())
                {
                    data = session.QueryOver<Object>()
                       ...ommiting

                    transaction.Commit();
                    return PartialView("_Partial", data);
                }

            }    

person Grunf    schedule 21.05.2012    source источник


Ответы (1)


1-й вопрос

Вам нужно настроить его в разделе конфигурации nhibernate:

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

Также я сейчас делаю что-то вроде этого:

if (!CurrentSessionContext.HasBind(SessionFactory))
{
    CurrentSessionContext.Bind(SessionFactory.OpenSession());
}

2-й вопрос

Просмотрите следующую статью, чтобы свободно изменять конфигурацию: currentsessioncontext свободно nhibernate как это сделать ?

3-й вопрос

Вы дважды закрываете сеанс.

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

закрывает вашу сессию. Затем вы сделали это снова в Application_EndRequest. Если у вас есть другой вопрос, задайте новый вопрос.

person Cole W    schedule 21.05.2012
comment
Я использую свободную настройку. Куда мне положить этот рекомендуемый код? - person Grunf; 21.05.2012
comment
stackoverflow.com/questions/4702703 / - person Cole W; 21.05.2012
comment
Спасибо за ваше время. Теперь у меня сессия закрыта при получении данных. Подробности в обновленном вопросе. - person Grunf; 21.05.2012
comment
Вы дважды закрываете сеанс. using (ISession session = SessionProvider.Instance.GetCurrentSession()) закрывает вашу сессию. Затем вы сделали это снова в Application_EndRequest. Если у вас есть другой вопрос, задайте новый вопрос. - person Cole W; 21.05.2012
comment
Конечно. Спасибо. Отправьте как ответ на мой вопрос, потому что я хотел бы принять ваш ответ. - person Grunf; 22.05.2012
comment
Вы уверены, что заставляете меня работать, чтобы получить принятый ответ. Я отредактировал приведенное выше, чтобы включить всю необходимую информацию. Пожалуйста, задавайте отдельные вопросы в следующий раз. Это для всех менее запутанно. Спасибо. - person Cole W; 22.05.2012