Почему 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 дважды...
Альтернатива - ленивая загрузка и пакетирование запросов, но требуется сделать только один круговой переход к базе данных.