我目前有这种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 。我的一位同事指出了另一个值,即调用。有关于此属性的值的任何已知文档吗?如果没有,对这些值有什么好的描述吗?我已经花了几个小时搜索谷歌一些解释没有有效的结果。
答案 0 :(得分:5)
这是我尝试解释这些(欢迎任何其他输入):
Difference between CallSessionContext, ThreadLocalSessionContext and ThreadStaticSessionContext
标准NH文档中有一节介绍这些内容,但我认为他们并没有很好地解释它或提供有关如何使用它的任何示例。这是NH文档链接。
http://nhibernate.info/doc/nhibernate-reference/architecture.html#architecture-current-session
StackOverflow上有几篇关于如何使用它的好文章:
What is the best NHibernate session management approach for using in a multithread windows service application?
NHibernate.HibernateException: No session bound to the current context
答案 1 :(得分:5)
“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);
}
您也可以使用ManagedWebSessionContext或ThreadStaticSessionContext代替CallSessionContext。
ManagedWebSessionContext - 适用于Asp.Net应用程序。会话附加到当前的HttpContext(在绑定时作为参数提供)。
ManagedWebSessionContext.Bind(HttpContext.Current,session)
ThreadStaticSessionContext - 会话附加到当前线程(我不鼓励使用它,因为线程会突然切换,并且您的附加会话可能会丢失)。
CallSessionContext - 适用于非Web应用程序。会话附加到CallContext。我可能错了,但我想这是会话附加到SessionFactory本身。只要整个应用程序有一个SessionFactory,这种方法将确保您永远不会获得并发活动会话。