NHibernate当前会话上下文问题

我最近已经从使用ISession直接转换为包装的ISession,工作单元类型模式.

我曾经使用SQL Lite(内存中)测试它.我有一个简单的帮助器类来配置我的SessionFactory,创建一个ISession然后使用SchemaExport构建模式然后返回我的ISession并且模式一直存在直到我关闭会话.我稍微改了一下,以便我现在配置一个SessionFactory,创建一个ISession,构建模式,并将工厂传递给我的NHibernateUnitOfWork并将其返回给我的测试.

var databaseConfiguration =
                SQLiteConfiguration.Standard.InMemory()
                .Raw("connection.release_mode", "on_close")
                .Raw("hibernate.generate_statistics", "true");

            var config = Fluently.Configure().Database(databaseConfiguration).Mappings(
                m =>
                {
                    foreach (var assembly in assemblies)
                    {
                        m.FluentMappings.AddFromAssembly(assembly);
                        m.HbmMappings.AddFromAssembly(assembly);
                    }
                });

            Configuration localConfig = null;
            config.ExposeConfiguration(x =>
                {
                    x.SetProperty("current_session_context_class", "thread_static"); // typeof(UnitTestCurrentSessionContext).FullName);
                    localConfig = x;
                });

            var factory = config.BuildSessionFactory();
            ISession session = null;

            if (openSessionFunction != null)
            {
                session = openSessionFunction(factory);
            }

            new SchemaExport(localConfig).Execute(false, true, false, session.Connection, null);

            UnitTestCurrentSessionContext.SetSession(session);

            var unitOfWork = new NHibernateUnitOfWork(factory, new NHibernateUTCDateTimeInterceptor());
            return unitOfWork;

在内部,NHibernateUnitOfWork需要获取用于创建模式的ISession,或者内存数据库实际上不具有模式,因此这是它调用以获取ISession的方法.

private ISession GetCurrentOrNewSession()
        {
            if (this.currentSession != null)
            {
                return this.currentSession;
            }

            lock (this)
            {
                if (this.currentSession == null)
                {
                    // get an existing session if there is one, otherwise create one
                    ISession session;
                    try
                    {
                        session = this.sessionFactory.GetCurrentSession();
                    }
                    catch (Exception ex)
                    {
                        Debug.Write(ex.Message);
                        session = this.sessionFactory.OpenSession(this.dateTimeInterceptor);
                    }

                    this.currentSession = session;
                    this.currentSession.FlushMode = FlushMode.Never;
                }
            }

问题是this.sessionFactory.GetCurrentSession总是抛出一个异常,说ICurrentSessionContext没有注册.

我已经尝试了很多不同的方法来设置属性和不同的值(如上所示,“thread_static”和我自己的ICurrentSessionContext),但似乎没有工作.

任何人都有任何建议

试试这个:

try
{
    if (NHibernate.Context.CurrentSessionContext.HasBind(sessionFactory))
    {
        session = sessionFactory.GetCurrentSession();
    }
    else
    {
        session = sessionFactory.OpenSession(this.dateTimeInterceptor);
        NHibernate.Context.CurrentSessionContext.Bind(session);
    }
}
catch (Exception ex)
{
    Debug.Write(ex.Message);
    throw;
}
翻译自:https://stackoverflow.com/questions/5914405/nhibernate-current-session-context-problem

转载注明原文:NHibernate当前会话上下文问题