Сессия не привязана к текущему контексту - PullRequest
7 голосов
/ 17 сентября 2011

Я следовал этому руководству: http://nhforge.org/blogs/nhibernate/archive/2011/03/03/effective-nhibernate-session-management-for-web-apps.aspx

При попытке загрузить страницу (mvc 3) я не получаю сообщение об ошибке «нет сеанса, привязанного к текущему контексту».

public static ISessionFactory BuildSessionFactory()
        {

            return Fluently.Configure()
                .Database(MsSqlConfiguration.MsSql2008 // 
                              .ConnectionString(@"Server=.\SQLExpress;Database=db1;Uid=dev;Pwd=123;")
                              .ShowSql())
                //.ExposeConfiguration(c => c.SetProperty("current_session_context_class", "web"))
                //.CurrentSessionContext<CallSessionContext>()             
                .Mappings(m => m.FluentMappings
                                   .AddFromAssemblyOf<User>())
                .ExposeConfiguration(cfg => new SchemaExport(cfg)
                                                .Create(false, false))
                .BuildSessionFactory();
        }

Фактическая ошибка в моем файле Repository.cs:

Строка 114: общедоступная виртуальная T Get (int id) Строка 115: {Строка 116: return _sessionFactory.GetCurrentSession (). Get (id);Строка 117:} Строка 118:

Когда я отлаживал его, _sessionFactory не был нулевым или чем-то еще, просто он не мог найти связанную сессию.

У меня подключен модуль httpmoduleв моем web.config, и он действительно запускается, так что это не проблема.

В моей конфигурации nhibernate я попробовал оба:

.ExposeConfiguration(c => c.SetProperty("current_session_context_class", "web"))

и

.CurrentSessionContext<CallSessionContext>()

Но это не сработало.

1 Ответ

9 голосов
/ 18 сентября 2011

Похоже, вы не привязываете сеанс к контексту. Посмотрите на пример ниже:

public class SessionFactory
{
    protected static ISessionFactory sessionFactory;
    private static ILog log = LogManager.GetLogger(typeof(SessionFactory));

    //Several functions omitted for brevity

    public static ISession GetCurrentSession()
    {
        if(!CurrentSessionContext.HasBind(GetSessionFactory()))
            CurrentSessionContext.Bind(GetSessionFactory().OpenSession());

        return GetSessionFactory().GetCurrentSession();
    }

    public static void DisposeCurrentSession()
    {
        ISession currentSession = CurrentSessionContext.Unbind(GetSessionFactory());

        currentSession.Close();
        currentSession.Dispose();
    }
}

Ключ к вышесказанному заключается в том, что всякий раз, когда вы извлекаете свой первый сеанс, вы связываете его с любым контекстом, который вы используете.

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