Выполняя такой запрос (используя Nhibernate 2.1.2):
ICriteria criteria = session.CreateCriteria<MyRootType>()
.SetFetchMode("ChildCollection1", FetchMode.Eager)
.SetFetchMode("ChildCollection2", FetchMode.Eager)
.Add(Restrictions.IdEq(id));
Я получаю несколько дубликатов объектов в какой-то декартовой форме. Например. если ChildCollection1
имеет 3 элемента, а ChildColection2
имеет 2 элемента, тогда я получаю результаты с каждым элементом в ChildColection1
, который дублируется, и каждый элемент из ChildColection2
трижды! Для меня это был момент WTF для меня...
Итак, как это сделать правильно?
- Использует SetFetchMode, как это поддерживается только при указании одной коллекции?
- Я просто использую его неправильно (я видел некоторые ссылки на трансформаторы результатов, но предполагал, что это будет проще).
- Это что-то другое в NH3?
Update:
В соответствии с предложением Felice я попытался использовать трансформатор DistinctRootEntity, но это все равно возвращает дубликаты. Код:
ICriteria criteria = session.CreateCriteria<MyRootType>()
.SetFetchMode("ChildCollection1", FetchMode.Eager)
.SetFetchMode("ChildCollection2", FetchMode.Eager)
.Add(Restrictions.IdEq(id));
criteria.SetResultTransformer(Transformers.DistinctRootEntity);
return criteria.UniqueResult<MyRootType>();