Почему nHibernate лениво загружает и игнорирует результаты будущего запроса?

У меня есть метод, который извлекает сущность из базы данных, используя nHibernate. Это довольно сложная сущность:

У Level4 есть много Level3, у которых есть много Level2, у которых есть много Level1, у которых есть Level1Ref

Поэтому я использую несколько таких вариантов:

        var future = this.Session.QueryOver<Level4>()
            .Where(x => x.Id == level4Id)
            .Fetch(x => x.Level3List).Eager
            .Fetch(x => x.Level3List.First().Level2List).Eager
            .Left.JoinAlias(x => x.Level3List, () => level3Alias, x => x.AnotherThing.Id == anotherThingId)
            .FutureValue();

И некоторые запросы, как это:

        this.Session.QueryOver<Level1>()
            .Fetch(x => x).Eager
            .Fetch(x => x.Level1Ref).Eager
            .Fetch(x => x.Level2).Eager
            .Inner.JoinAlias(x => x.Level2, () => level2Alias)
            .Inner.JoinAlias(() => level2Alias.Level3, () => level3Alias, x => x.AnotherThing.Id == anotherThingId && level3Alias.Level4.Id == level4Id)
            .Future();

А потом:

var record = future.Value;

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

Вопрос:

Это проблема. Что я? сделал неправильно в моем запросе, что nHibernate думает, что он должен пойти в базу данных для информации, которую он уже получил? (У меня есть догадка, что мне нужно поменять некоторые из моих битов JoinQueryOver для активных выборок?

(Вопросы отредактированы для упрощения примеров)

1 ответ

Решение

После долгих исследований я смог заставить работать только так, чтобы поменять все мои запросы, чтобы они имели одинаковый TRoot. То есть. Измените их, чтобы они все начинались так:

this.Session.QueryOver<Level4>()

Это явно не идеально в таких ситуациях:

рыботорговец

Коллекция рыб

Коллекция Eye Коллекция Bone

Это значит, что мне нужно написать два запроса и присоединиться к Fish дважды...

Альтернатива - ленивая загрузка и пакетирование запросов, но требуется сделать только один круговой переход к базе данных.

Другие вопросы по тегам