2010-09-15 33 views
2

我剛剛將我的應用程序從LINQ2SQL轉換爲NHibernate,我試圖弄清楚如何優化下面的例子。我嘗試使用.Future方法,但是當我的會話關閉視圖,然後嘗試獲取數據,我得到一個會話關閉錯誤。優化NHibernate查詢的任何想法? (.Future)

有沒有人知道這種事情的最佳做法?我有很多場景,我在LINQ中調用一個使用NHibernate獲取數據的方法,但我不想返回不需要的大量數據。

方法來獲取所有的書:

public IEnumerable<Book>GetAllBooks() 
     { 
      try 
      { 
       using (ISession session = NHibernateHelper.OpenSession()) 
       { 
        return session.CreateCriteria<Widget>().ToList<Book>(); 
       } 
      } 
      catch (Exception ex) 
      { 
       //Error stuff here 
      } 
     } 

方法則擴展了該功能

 public IEnumerable<Book> GetDefaultBookReadingList() 
     { 
      return from p in GetAllBooks() 
        where p.IsDefault 
        select p; 
     } 

回答

1

一旦你關閉會話(這發生在你的using塊的末尾,你贏了無法檢索任何延遲加載的數據

根據應用程序類型的不同,會話管理會有所不同,但版本庫應該是NEV ER打開和關閉會話。

在Web應用程序中,最常見的模式是session-per-request。

在Windows應用程序,它可以交談的每商業交易,或者在簡單的實現,會議每視圖(模型)

+0

所以我應該在哪裏打開和關閉我的會議呢?在服務層?我不是很喜歡將會話對象傳遞給每個函數,並且您只能一次打開一個會話,所以如果我在使用多個回購時使用回購聲明傳遞它,它將無法很好地工作? – Andrew 2010-09-16 08:33:50

+0

你能解釋一下嗎? – LiamB 2010-09-16 09:42:46

+0

存儲庫應該使用SessionFactory進行初始化,並使用'GetCurrentSession()'來獲取會話。例如,綁定/解除綁定當前會話可以在Web應用程序的BeginRequest/EndRequest上完成。 – 2010-09-16 14:36:57