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