ASP.NET自定义角色提供程序NHibernate错误

3

你好,

我正在我的nhibernate应用程序中实现自定义角色提供程序。每当我想访问nhibernate会话时,我都会调用一个名为repository的存储库。

因此,当我的角色提供程序初始化时

public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config) {

            base.Initialize(name, config);
            Repository = new Repository();
        }

然后我进行了覆盖。
public override string[] GetRolesForUser(string username) {
        var users = Repository.QueryAll<Users>();

//然后我进行过滤等操作

    }

但是每次调用此函数时,我总是会收到一个错误,即NHibernate会话已关闭。 我调试了nhibernate源代码,发现这里的会话与我的控制器中的会话有不同的guid(我也使用ASP.NET MVC)。 而且这个特定的会话在我到达这里时就已经关闭了。 我不知道是谁关闭了它。我知道它是在应用程序启动时开始的,只有那时才会启动。 有人知道我做错了什么吗? 我想在此提供程序中仍然使用Nhibernate,但不再出现错误。 谢谢。

你的会话管理策略是什么? - Mauricio Scheffer
我在应用程序启动时启动一个会话工厂,并在存储库构造函数中获取当前会话。 - Para
我的意思是你何时何地打开和关闭会话? - Mauricio Scheffer
2个回答

2

我遇到了似乎完全相同的问题。不要忘记,角色和成员资格提供程序仅在应用程序的生命周期内实例化一次并存在。如果您正在使用每个Web请求模式的会话,则ISession将在第一个请求后关闭,然后对提供程序内部的任何ISession的引用可能为空以进行后续请求。

您可以通过注入对ISessionFactory的引用并调用GetCurrentSession来解决此问题,而不是直接持有对ISession的引用。


1

这就是我最终解决它的方法。

在我的存储库类中,我有这个:

public Repository()
{
    this.Session = SessionManager.GetCurrentSession();
}

我完全删除了构造函数 我改为使用以下内容:

private ISession _session;
        protected ISession Session
        {
            get
            {
                if (_session == null)
                {
                    _session = SessionManager.GetCurrentSession();
                }
                return _session;
            }
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接