NHibernate - внешнее соединение, не ленивое, игнорирование не найдено - как вы строите объекты в одном выражении? - PullRequest
2 голосов
/ 18 ноября 2011

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

У меня есть несколько моделей доменов, сопоставленных с ихТаблицы базы данных.

Я использую объект Criteria для их запроса.

 var query = session.CreateCriteria(typeof(Posting))
                .CreateAlias("Person", "person", JoinType.InnerJoin).SetFetchMode("Person", FetchMode.Eager)
                .CreateAlias("Location", "location", JoinType.InnerJoin).SetFetchMode("Location", FetchMode.Eager)
                .CreateAlias("Post", "post", JoinType.InnerJoin).SetFetchMode("Post", FetchMode.Eager)
                .CreateAlias("post.Zone", "postzone", JoinType.LeftOuterJoin).SetFetchMode("post.Zone", FetchMode.Select)

Это дает точную оценку, которую я ищу.Я ожидал бы, что он будет заполнять объекты с нетерпением (что и происходит) и оставлять нулевые для post.Zone, где отношения не удаются.

В моем отображении я должен был сказать not-found = ignore (Notfound.Ignore () FNH), который из-за внешнего соединения заставляет NH генерировать несколько подзапросов - все к таблице зон - которые мне не кажутся необходимыми, тем более что у него уже есть данные, необходимые для заполненияОбъект зоны.

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

Спасибо, Сэм

1 Ответ

2 голосов
/ 18 ноября 2011

К сожалению, известная проблема, что not-found=ignore вызывает дополнительные выборы. В течение достаточно долгого времени (2007 г.) для этого были поданы отчеты об ошибках как в NHibernate , так и в Hibernate , и в настоящее время не известны никакие обходные пути, кроме удаления not-found=ignore или изменения данные присутствуют в базе данных, поэтому они больше не требуются.

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

...