我是N休眠的新手。我在应用程序中使用n休眠。我编写的代码可以成功运行,但是运行起来有点慢,因为当我在休眠状态探查器中签入时,它向我显示了流程缓慢的一些原因。“每个请求超过一个会话”我的代码是
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)!
但是当我在配置文件中添加以下代码时
“属性名称=“ current_session_context_class”>线程静态/属性>”
它显示不同的异常是
没有会话绑定到当前上下文
我正在进行最后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应用程序的上下文中使用它)。应对此警告的一种流行方法是使用“每个请求会话”模式。在这种模式下,对于每个传入请求,您都将在请求命中您的代码时创建一个新的会话对象,在整个请求处理过程中使用该会话对象,并在请求离开您的代码时处置该会话对象。可以将以下代码添加到global.asax.cs
ASP.NET MVC应用程序的文件中,以获取“每个请求的会话”
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();
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句