Загружайте коллекции с нетерпением в NHibernate, используя Criteria API - PullRequest
0 голосов
/ 15 мая 2010

У меня есть сущность A, которая имеет сущности B и сущности HasMany. Все сущности A, B и C имеют некоторые ссылки x, y и z, которые следует загружать с нетерпением.

Я хочу прочитать из базы данных все объекты A и загрузить коллекции B и C с помощью API критериев. До сих пор я могу получить ссылки в «А» с нетерпением. Но когда коллекции загружены, ссылки в них загружаются лениво.

Вот как я это делаю

            AllEntities_A =
            _session.CreateCriteria(typeof(A))
            .SetFetchMode("x", FetchMode.Eager)
            .SetFetchMode("y", FetchMode.Eager)
            .List<A>().AsQueryable();

Отображение объекта A с использованием Fluent показано ниже. _B и _C являются частными IList для B & C соответственно в A.

        Id(c => c.SystemId);
        Version(c => c.Version);
        References(c => c.x).Cascade.All();
        References(c => c.y).Cascade.All();

        HasMany<B>(Reveal.Property<A>("_B"))
            .AsBag()                
            .Cascade.AllDeleteOrphan()
            .Not.LazyLoad()
            .Inverse()
            .Cache.ReadWrite().IncludeAll();
        HasMany<C>(Reveal.Property<A>("_C"))
            .AsBag()
            .Cascade.AllDeleteOrphan()
            .LazyLoad()
            .Inverse()
            .Cache.ReadWrite().IncludeAll();

Я не хочу вносить изменения в файл сопоставления и хотел бы загружать всю сущность A с нетерпением. то есть я должен получить список A, где будет список B и C, чьи ссылочные свойства также будут загружены с нетерпением

1 Ответ

3 голосов
/ 15 мая 2010

Вы пытаетесь сделать декартово произведение здесь. Я думаю, что для этого NHibernate требует отображения отношений как наборов, а не пакетов, так как пакеты допускают дублирование.

Во всяком случае, декартовы произведения очень неэффективны. Вместо этого используйте несколько запросов или будущие запросы.

См:

...