2009-11-03 67 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