Стремление загружать дочерние и дочерние коллекции в NHibernate - PullRequest
4 голосов
/ 01 сентября 2009

У меня проблема с NHibernate, пытающимся загрузить небольшую иерархию данных. Моя модель домена выглядит так:

class GrandParent
{
    int ID{get;set;}
    IList<Parent> Parents {get; set;}
}

class Parent
{
    IList<Child> Children {get; set;}
}

class Child
{
}

и я бы хотел загрузить всех родителей и детей для данного дедушки. Этот запрос Linq-to-NH создает правильный SQL и загружает GrandParent, как и ожидалось: (в примере предполагается, что у дедушки есть 2 родителя, у каждого из которых есть 2 дочерних объекта, то есть всего 4 дочерних объекта).

var linq = session.Linq<GrandParent>();
linq.Expand("Parents");
linq.Expand("Parents.Children");
linq.QueryOptions.RegisterCustomAction(c => 
    c.SetResultTransformer(new DistinctRootEntityResultTransformer()));
var grandparent = (select g from session.Linq<GrandParent>()
                   where g.ID == 1
                   select g).ToList();

Assert(grandparent.Count == 1); //Works
Assert(grandparent.Parents.Count == 2); //Fails - count = 4!

Коллекция grandparent.Parents содержит 4 элемента, 2 из которых являются дубликатами. Кажется, что DistinctRootEntityResultTransformer работает только с коллекциями уровня 1, поэтому коллекция Parents дублируется в зависимости от того, сколько дочерних объектов у каждого родителя.

Можно ли заставить NH включать только отдельные родительские объекты?

Большое спасибо.

1 Ответ

1 голос
/ 09 сентября 2009

Если для вашего сопоставления установлено значение FetchType.Join, попробуйте изменить его на FetchType.Select.

...