Загрузите коллекции с нетерпением в Nhibernate с использованием критериев API
Вопрос
У меня есть сущность, а казанным сущностями B и объектами C. Все объекты A, B и C имеют некоторые ссылки x, y и z, которые должны быть нетерпеливо загружены.
Я хочу прочитать из базы данных все объекты A и загружать коллекции B и с нетерпением с использованием API критериев. До сих пор я могу получить ссылки «a» с нетерпением. Но когда коллекции загружены, ссылки внутри них наносится лениво.
Вот как я это делаю
AllEntities_A =
_session.CreateCriteria(typeof(A))
.SetFetchMode("x", FetchMode.Eager)
.SetFetchMode("y", FetchMode.Eager)
.List<A>().AsQueryable();
Картирование объекта A Использование свободно, как показано ниже. _B и _C являются частными айлистами для 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, где будет список B'S и C, чьи справочные свойства также будут загружены с нетерпением
Решение
Вы пытаетесь сделать картезианский продукт здесь. Я думаю, что Nibernate требует отображения отношений в качестве наборов вместо сумки для этого, поскольку сумки позволяют дубликаты.
Во всяком случае, декартовые продукты очень неэффективны. Вместо этого используйте несколько запросов или будущих запросов.
Видеть:
- Nhibernate: нетерпеливо загрузка двух дочерних коллекций (один из которых является составной список)
- https://nibernate.jira.com/browse/nh-1471.
- http://nibernate.info/blog/2008/09/06 /ger-loading-gregate-with-many-child-collections.html.
- http://ayende.com/blog/Archive/2010/01/16 Tarchielly-loading- достоинство - ассоциации- Эффективно-with-nibernate.aspx.