C# Hibernate OpenSession()与GetCurrentSession()的比较
我不熟悉冬眠。我正在我的应用程序中使用n hibernate。我编写的代码工作成功,但有点慢,因为当我签入hibernate profiler时,它会告诉我进程慢的一些原因C# Hibernate OpenSession()与GetCurrentSession()的比较,c#,mysql,.net,hibernate,nhibernate,C#,Mysql,.net,Hibernate,Nhibernate,我不熟悉冬眠。我正在我的应用程序中使用n hibernate。我编写的代码工作成功,但有点慢,因为当我签入hibernate profiler时,它会告诉我进程慢的一些原因 using (ISession session = NContext._mSessionFactory.OpenSession()) { ICriteria criteriaAspNetUser = session.CreateCriteria(typeof
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\u session\u context\u class
但当我在配置文件中添加以下代码时
属性名称=当前会话上下文类>线程静态/属性>
它显示不同的异常,即
没有绑定到当前上下文的会话
我过去三天一直在努力,但找不到任何解决方案。请帮助我,我很担心 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并返回会话对象
请注意,SessionManager上有一个Unbind方法,可以用来解除会话对象的绑定
现在,关于警告,每个请求有多个会话。此警告清楚地告诉您,如果您在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();
}
}