Активная загрузка дочерних и дочерних коллекций в NHibernate

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

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

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

class Child
{
}

и я хотел бы загрузить всех родителей и детей для данного GrandParent. Этот запрос 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 включать только отдельные родительские объекты?

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


person Simon    schedule 01.09.2009    source источник
comment
Удалось ли вам это решить? Это действительно раздражает.   -  person Egor Pavlikhin    schedule 28.03.2010
comment
Да - см. Мой комментарий ниже об изменении IList для ICollection и использовании 'set' в сопоставлениях.   -  person Simon    schedule 31.03.2010


Ответы (1)


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

person mxmissile    schedule 08.09.2009
comment
Спасибо mxmissile, тогда будет работать, хотя вы не можете указать тип выборки в Linq-to-NH (если я что-то не упустил), и это не то, что я хочу использовать все время, поэтому я не хочу изменять сопоставления . Еще одно исправление - изменить коллекции IList ‹› на ICollection ‹› и использовать в сопоставлении 'set' вместо 'bag'. Я также вместе взломал ResultTransformer, чтобы справиться с этим, и предоставлю ссылку здесь, как только у меня будет разумный стандарт. - person Simon; 09.09.2009
comment
@Simon, вы можете указать тип выборки по умолчанию в сопоставлениях - person zvolkov; 05.11.2009