0

Я занимаюсь проблемой N + 1, и я хочу, чтобы загрузить коллекцию в конкретном запросе, но я получаю сообщение об ошибке «не удалось лениво инициализировать коллекцию» или запрос сохраняет ленивую загрузку.Fetch Eager NHibernate не удалось лениво инициализировать коллекцию

Я пробовал много предложений, заданных членами stack, но никто не работал.

Мой пример лицо:

public class Bar 
{ 
    private _IList<Foo> _fooList; 
    public IEnumerable<Foo> FooList {get{return _fooList;} } 
} 

Пример карты:

HasMany(d => d.FooList) 
       .Access.CamelCaseField(Prefix.Underscore) 
       .KeyColumn("IdBar") 
       .Cascade.AllDeleteOrphan() 
       .Inverse(); 

запросов, которые подбрасывает ошибка (не удалось лениво инициализировать коллекцию):

var test = GetSession().Query<Bar>() 
       .Fetch(b => b.FooList); 

IList<Bar> bars= GetSession().QueryOver<Bar>() 
       .Fetch(d => d.FooList).Eager 
       .List(); 

запрос, который еще с N + 1:

 IList<Bar> bars= GetSession().QueryOver<Bar>() 
      .Fetch(d => d.FooList).Eager 
      .JoinQueryOver<Foo>(d => d.FooList) 
      .Where(f => f.Active).List<Bar>(); 

     Foo fooAlias = null; 
     IList<Bar> bars= GetSession().QueryOver<Bar>() 
      .Fetch(d => d.FooList).Eager 
      .JoinAlias(d => d.FooList,() => fooAlias) 
      .List(); 

Мне нужна помощь в решении этой проблемы с N + 1, с нетерпением загружая коллекцию FooList.

ответ

0

Вы использовали HQL вместе с ... LEFT JOIN FETCH ...? Имели ли они одинаковые проблемы?

+0

Нет, я еще не знаю, как использовать HQL. Я буду искать его – TiagoBrenck

+0

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

0

Mapping должен использовать

.Access.ReadOnlyPropertyThroughCamelCaseField 

вместо этого.