C# Hibernate OpenSession()与GetCurrentSession()的比较

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

我不熟悉冬眠。我正在我的应用程序中使用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\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();
    }
}