Я читал эту статью о Nhibernate Lazy Загрузка http://nhforge.org/wikis/howtonh/lazy-loading-eager-loading.aspx, и он использует и пример структуры класса, подобной этой:
В статье затем показываетсяследующий код:
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.Если мы получим доступ к позициям строки заказа после загрузки заказа, мы создадим оператор выбора для каждой позиции, к которой мы обращаемся.
Это поведение, которое я запомнил при ленивой загрузке, а именно, когда я впервые получаю заказ,коллекция строк заказа - это прокси набора строк заказа, затем, когда я перебираю строки заказа, каждая из них загружается по требованию.
Однако это не то поведение, которое я наблюдаю.Что происходит, когда я пытаюсь сделать это в моем приложении, так это то, что, когда я получаю заказ, достаточно точно, чтобы коллекция строк заказа была прокси-сервером, но как только я получаю доступ к первому OrderLine, используя:
fromDb.OrderLines.First()
Вся коллекциязагружается в памятьЭто проблема для меня, так как коллекция содержит много элементов, и я хочу только поменять один, но если я загружаю все элементы в память, изменяю один и пытаюсь сохранить порядок, я, очевидно, получаю очень низкую производительность.
Так изменилось ли поведение с тех пор, как я написал эту статью?Я просто неправильно понимаю, как работает ленивая загрузка?Или я могу настроить NHibernate так, чтобы он загружал только элементы из нужной коллекции?