我是N hibernate的新手。我在我的应用程序中使用n hibernate。我编写的代码运行成功但速度很慢,因为当我检查了hibernate profiler时,它向我展示了进程缓慢的原因。“每个请求多个会话”我的代码是
using (ISession session = NContext._mSessionFactory.OpenSession())
{
ICriteria criteriaAspNetUser = session.CreateCriteria(typeof(AspNetUsers));
criteriaAspNetUser.Add(NHibernate.Criterion.Restrictions.Eq("Email", email));
criteriaAspNetUser.Add(NHibernate.Criterion.Restrictions.Eq("PasswordHash", password));
当我使用GetCurrentSession()函数时,它会返回一些异常
没有配置CurrentSessionContext(设置属性current_session_context_class)!
但是当我在配置文件中添加以下代码时
“property name =”current_session_context_class“> thread_static / property>”
显示不同的异常
没有绑定到当前上下文的会话
我正在处理它最近3天但是找不到任何解决方案请帮助我我很担心。
答案 0 :(得分:3)
CurrentSessionContext
只告诉NHibernate它应该使用哪个会话上下文实现。根据您正在编写的应用程序类型,有多种可用。配置完成后,您需要将创建的每个会话对象绑定到会话上下文。以下代码解释了如何执行此操作
public class SessionManager
{
private static readonly ISessionFactory sessionFactory;
static SessionManager()
{
sessionFactory = new DatabaseConfiguration().BuildSessionFactory();
}
public static ISession GetCurrentSession()
{
if (CurrentSessionContext.HasBind(sessionFactory))
{
return sessionFactory.GetCurrentSession();
}
var session = sessionFactory.OpenSession();
CurrentSessionContext.Bind(session);
return session;
}
public static void Unbind()
{
CurrentSessionContext.Unbind(sessionFactory);
}
}
现在,只要您需要会话对象,就可以调用SessionManager.GetCurrentSession
并在内部执行以下操作
CurrentSessionContext
并返回会话对象请注意,Unbind
上有一个SessionManager
方法可用于取消绑定会话对象。
现在,关于警告more than one session per request
。此警告清楚地告诉您每个请求使用多个会话(如果您在Web应用程序的上下文中使用它)。解决此警告的一种流行方法是根据请求使用"会话"图案。在此模式中,对于每个传入请求,您将在请求命中代码时创建新的会话对象,在请求处理过程中使用该会话对象,并在请求离开代码时处置会话对象。可以将以下代码添加到ASP.NET MVC应用程序的global.asax.cs
文件中,以获得每个请求的"会话"
public class MvcApplication : HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
protected void Application_BeginRequest(object sender, EventArgs e)
{
var session = SessionManager.GetCurrentSession();
}
protected void Application_EndRequest(object sender, EventArgs e)
{
var session = SessionManager.GetCurrentSession();
session.Close();
session.Dispose();
}
}