NHibernate-внешнее соединение, не ленивый, игнорирование не найдено-как вы строите объекты в одном утверждении?


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

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

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

 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.Зона, где отношения терпят неудачу.

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

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

Спасибо, Сэм

1 2

1 ответ:

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

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