Запросы nHibernate Criteria создают дубликаты с использованием подкачки - PullRequest
0 голосов
/ 28 октября 2011

Версия nHibernate 2.1

Как видно из множества подобных вопросов - мы не одиноки в том, что испытываем проблемы с подкачкой страниц, генерирующих дубликаты.Мы думали, что это происходит только с запросами HQL, но один из наших клиентов сообщил, что видел его там, где запрос является критерием запроса.

Пока что мы видели его только на стороне отчетности - там, где мы склонны собиратьбиты информации от различных «связанных» сущностей и использование AliasToBeanTransformer для помещения его в DTO (DataTransferObject):

.SetResultTransformer (новый AliasToBeanResultTransformer (typeof (OurDTO)));

We 'Мы не знакомы с nHibernate, но мы, конечно, не знаем о многих его тонкостях, и в результате мы не знали о

новом NHibernate.Transform.DistinctRootEntityResultTransformer ()

которые потенциально могут устранить наши дубликаты, но я изо всех сил пытаюсь понять, как мы могли бы сделать это, когда это не отображаемая сущность, то есть DTO.

Мы попытались создать собственный диалект, который, кажется, послужилнекоторые люди достаточно хорошо, чтобы быть уверенными в последовательном поведении.

Я понимаю, что нет такой вещи, как сереброbullet и context всегда важны, но кто-нибудь сумел придумать решение для этого?

Код, который мы используем для обработки параметров сортировки страниц, выглядит следующим образом:

        query.SetMaxResults(50);

        for (int i = 0; ; ++i)
        {
            query.SetFirstResult(i * 50);
            IList results = query.List();
            cumulativeResults.AddRange(results);
            OnRecordsLoaded(results.Count);
            if (results.Count < 50)
            { break; }

Большое спасибо за любой вклад по этому вопросу.С уважением, Колин

1 Ответ

0 голосов
/ 30 октября 2011

NHibernate не производит дубликаты. Реляционная база данных делает. И вы не можете предотвратить это.

Если ваш запрос включает в себя соединение «один ко многим», например, у вас есть таблицы клиентов и заказов, а между клиентами и заказами существует отношение один ко многим, и вы запрашиваете клиентов, фильтрующих по заказам, вы получите несколько клиентов (из та же личность)

Способ предотвратить использование HashedSets в памяти, предполагая, что вы корректно переопределите Equals и GetHashCode для ваших сущностей, что вам и следует Если вы поместите результат в HashedSet (из Iesi или .NET 4), они уничтожат дубликаты.

Это одна из проблем ОРМ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...