NHibernate多对多和ISession.Close()

NHibernate多对多和ISession.Close(),nhibernate,Nhibernate,我正在使用NHibernate进行我的项目。我是NHibernate的初学者 我使用多对多关系映射“用户”和“角色”。以下是获取用户的代码: public User GetUser(int userId){ using(ISessuib session = new SessionManager().GetSession()) { return session.Get<User>(userId); } } public void LazyLoadUsingSes

我正在使用NHibernate进行我的项目。我是NHibernate的初学者

我使用多对多关系映射“用户”和“角色”。以下是获取用户的代码:

public User GetUser(int userId){
  using(ISessuib session = new SessionManager().GetSession())
  {
     return session.Get<User>(userId);
  }
}

public void LazyLoadUsingSessionTest(){
  var user= GetUser(1);
  Assert.NotNull(user.Roels);
}
public用户GetUser(int-userId){
使用(ISessuib session=new SessionManager().GetSession())
{
返回session.Get(userId);
}
}
使用SessionTest()的公共无效LazyLoad{
var user=GetUser(1);
Assert.NotNull(user.Roels);
}
它引发异常:延迟初始化集合失败,没有会话或会话已关闭

如果我不在“GetUser”方法中使用“using”语句,它就可以工作但我必须调用session.Close()来释放资源

当我在网页中使用它时,我只想使用GetUser(),而不是ISession对象。所以我的问题是:这是否意味着我的网页中必须有ISession对象(释放资源)?或者任何更好的解决方案?(因为我不希望ISession对象出现在我的aspx.cs文件中)


谢谢!

您需要使用每请求会话模式。有关将NHibernate与ASPX一起使用的最佳实践的说明,请参阅此部分。

最简单的方法是使用NHibernateUtil.Initialize(详细信息请阅读):

使用(ISession session=new SessionManager().GetSession())
{
User=session.Get(userId);
初始化(用户角色);
返回用户;
}
但是,您迟早需要以某种方式管理应用程序中的会话。我建议创建一个数据提供程序层,让您能够访问数据库。数据提供程序层将管理会话的创建和销毁。您可以为每个请求或每个会话(ASP.Net会话期间的单个会话)设置会话


这一系列视频会很有帮助。第5课和第13课与您最相关。

对不起,这是个糟糕的建议。通过这种方式,您可以同时破坏延迟加载和事务隔离,同时用大量垃圾破坏代码。
using(ISession session = new SessionManager().GetSession())
{
  User user = session.Get<User>(userId);
  NHibernateUtil.Initialize(user.Roles);
  return user;
}