Нужно объяснение на NHibernation ленивая загрузка - PullRequest
0 голосов
/ 07 января 2011

У меня есть продукт класса с ценами детской коллекции:

public class Product
{
    private ICollection<Price> prices;

    protected Product()
    {
        prices = new List<Price>();
    }
}

Отображение NHibernate выглядит следующим образом

<xml version="1.0" encoding="utf-8">
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
    <class name="Product" table="Product">

    <id name="id" column="ProductId" access="field">
        <generator class="identity"/>
    </id>

            <bag name="prices" access="field" cascade="all-delete-orphan"  lazy="true">
        <key column="ProductId"/>
        <one-to-many class="Product.Price"/>
    </bag>

        </class>

Вы видите, что коллекция цен загружена лениво.

Продукты загружаются из базы данных следующим образом:

public ICollection<Product> ListProducts()
    {
        ISession session = GetCurrentSession();

        return session
            .CreateCriteria(typeof(Product))
            .List<Product>();
    }

Функция ссылается на GetCurrentSession (), который имеет следующее содержимое:

protected ISession GetCurrentSession()
    {
         return sessionProvider.GetCurrentSessionFrom(sessionFactoryConfigName);
    }

Когда я загружаю продукты, я ожидаю, что на месте Price-Collections в продуктах находится прокси, потому что цены имеют lazy-loading = true. Но во время отладки с помощью инструмента просмотра Visual Studio я могу просматривать продукты и просматривать коллекцию цен с полным содержимым (цены со всеми их свойствами). Почему это так?

Ответы [ 2 ]

3 голосов
/ 07 января 2011

, потому что VS всегда вызывает метод получения Price, который, в свою очередь, загружает все цены в случае, если цены равны нулю.Если вы используете SQL Server и хотите проверить, работает ли отложенная загрузка должным образом, используйте SQL Server Profiler (используйте AnjLab SqlProfiler, если вы используете Express Edition).

2 голосов
/ 07 января 2011

Поскольку во время отладки вы получили доступ к свойству «Цены», прокси-сервер загрузит коллекцию продуктов ... Это означает, что вы запустили ленивый процесс загрузки, «просмотрев» свойство «Цены».

Вы можете увидеть, что происходит, настроив nhibernate так, чтобы выводимые SQL-операторы выводились (опция конфигурации show_sql).

...