NHibernate配置"current_session_context_class"可能的值和描述

joh*_*oss 7 c# nhibernate fluent-nhibernate

我目前有这个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;  

     }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是暴露的属性" current_session_context_class".我知道两个值:thread_staticweb.我的一位同事指出了另一个价值,即电话.有关于此属性的值的任何已知文档吗?如果没有,对这些值有什么好的描述吗?我已经花了几个小时搜索谷歌一些解释没有有效的结果.

Col*_*e W 6

这是我试图解释这些(欢迎任何额外的输入):

CallSessionContext,ThreadLocalSessionContext和ThreadStaticSessionContext之间的区别

在标准的NH文档中有一节关于这些,但我认为他们没有很好地解释它或提供有关如何使用它的任何示例.这是NH文档链接.

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

StackOverflow上有几篇关于如何使用它的好文章:
在多线程Windows服务应用程序中使用的最佳NHibernate会话管理方法是什么?
NHibernate.HibernateException:没有绑定到当前上下文的会话


lov*_*mar 5

"managed_web","call","thread_static"和"web"是可能的值.在nhibernate配置中配置如下:

<property name="current_session_context_class">call</property>
Run Code Online (Sandbox Code Playgroud)

配置完成后,您可以使用SessionFactory.GetCurrentSession().你必须自己绑定和取消绑定会话.一个示例实现:

if (CallSessionContext.HasBind(_sessionFactory))
            {
                session = SessionFactory.GetCurrentSession();
            }
            else
            {
                session = SessionFactory.OpenSession();
                CallSessionContext.Bind(session);
            }
Run Code Online (Sandbox Code Playgroud)

您也可以使用ManagedWebSessionContext或ThreadStaticSessionContext代替CallSessionContext.

ManagedWebSessionContext - 适用于Asp.Net应用程序.会话附加到当前的HttpContext(绑定时作为参数提供).

ManagedWebSessionContext.Bind(HttpContext.Current,session)
Run Code Online (Sandbox Code Playgroud)

ThreadStaticSessionContext - 会话附加到当前线程(我不鼓励使用它,因为线程会突然切换,并且您的附加会话可能会丢失).

CallSessionContext - 适用于非Web应用程序.会话附加到CallContext.我可能错了,但我想这是会话附加到SessionFactory本身.只要整个应用程序有一个SessionFactory,这种方法将确保您永远不会获得并发活动会话.