2009-11-03 65 views
0

我为我的项目使用NHibernate。我在NHibernate上工作的初学者很多。NHibernate多对多和ISession.Close()

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

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); 
} 

它抛出一个异常:无法懒洋洋地初始化集合,没有会话或会话关闭

如果我不使用“使用”的声明在“GetUser”方法中,它起作用。 但我必须调用session.Close()当我在网页中使用它来释放资源

,我只希望使用的getUser(),而不是ISession的object.so我的问题是:这是否意味着我必须在我的网页上有一个ISession对象(释放resouse)?或任何更好的解决方案?(因为我不希望的Isession对象出现在我的aspx.cs文件)

感谢!

回答

2

您需要使用每个请求模式会话。请参阅此link以获取有关在ASPX中使用NHibernate的最佳实践的说明。

-1

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

using(ISession session = new SessionManager().GetSession()) 
{ 
    User user = session.Get<User>(userId); 
    NHibernateUtil.Initialize(user.Roles); 
    return user; 
} 

但是,迟早你需要在你的应用程序以某种方式管理会话。我建议创建一个数据提供程序层,使您可以访问数据库。数据提供者层将管理会话的创建和销毁。您可以为每个请求或每个对话创建一个会话(在ASP.Net会话期间,单个ISession)。

Summer Of NHibernate视频系列将是有益的。第5节和第13节与你最相关。

+0

对不起,但这是一个坏建议。通过这种方式,您可以同时销毁惰性加载和事务隔离,同时用大量垃圾炸毁代码。 – 2009-11-03 13:26:00