我正在讀這篇文章NHibernate的延遲加載http://nhforge.org/wikis/howtonh/lazy-loading-eager-loading.aspx,它使用和實施例的一類結構類似這樣的:NHibernate的延遲加載行爲
的製品然後顯示如下代碼:
using (ISession session = SessionFactory.OpenSession())
{
var fromDb = session.Get<Order>(_order.Id);
int sum = 0;
foreach (var line in fromDb.OrderLines)
{
// just some dummy code to force loading of order line
sum += line.Amount;
}
}
它然後繼續講:
第n + 1個塞萊ct聲明的問題。如果我們在加載訂單後訪問訂單行項目 ,我們將爲我們訪問的每行 項目生成select語句。
這是我remebered延遲加載的特性,即當我第一次拿到訂單,訂單行收集的訂單行集合的代理,然後我通過命令行迭代每一個被加載一經請求。
但是,這不是我正在觀察的行爲。什麼時候我嘗試這在我的應用情況是,當我得到足夠確保訂單的訂單行的集合是一個代理,但只要我訪問使用第一訂單行:
fromDb.OrderLines.First()
整個集合是裝進入記憶。這對我來說是一個問題,因爲集合包含很多項目,我只想更改一個項目,但是如果將所有項目加載到內存中並更改內存並嘗試保存順序,我顯然會獲得非常差的性能。
自從寫這篇文章以來,行爲變化了嗎?我只是誤解延遲加載是如何工作的?或者有什麼辦法可以配置NHibernate只加載它需要的集合中的項目?