asp.net自定义角色提供程序nhibernate错误

时间:2011-01-05 20:24:06

标签: asp.net nhibernate roleprovider

HI,

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

所以当我的角色提供者初始化时

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,但不再得到错误。 谢谢

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

这就是我最终修复它的方式。

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

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

我完全删除了构造函数 我把它放进去了:

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