3

你好,

我正在我的 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 会话已关闭。我调试了休眠源代码,结果发现这里的会话与我的控制器中的会话有不同的 guid(我也在使用 ASP.NET MVC)。当我到达这里时,这个特定的会议已经结束。不知道谁关了 我知道它是在应用程序启动时启动的,然后才启动。

有谁知道我做错了什么?我仍想在此提供程序中使用 Nhibernate,但不再收到错误消息。谢谢

4

2 回答 2

2

我有什么似乎是完全相同的问题。不要忘记 Role 和 Membership 提供程序只实例化一次并且在应用程序的整个生命周期内都存在。如果您使用 Session per Web request 模式,则 ISession 将在第一个请求后关闭,然后对提供程序内部的 ISession 的任何引用对于后续请求都可能为空。

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

于 2011-02-25T23:08:41.773 回答
1

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

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

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

我完全删除了构造函数,而是将其放入:

private ISession _session;
        protected ISession Session
        {
            get
            {
                if (_session == null)
                {
                    _session = SessionManager.GetCurrentSession();
                }
                return _session;
            }
        }
于 2011-04-16T13:58:34.040 回答