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 ответ:
К сожалению, это известная проблема, которая
not-found=ignore
вызывает дополнительные выборы. Были сообщения об ошибках, поданные для этого в обоих NHibernate и Hibernate в течение довольно долгого времени (2007), и в настоящее время не было сделано никаких известных обходных путей, кроме удаленияnot-found=ignore
или изменения данных, присутствующих в базе данных, так что это больше не требуется.Возможным обходным путем, хотя и не очень хорошим, было бы заставить хранимую процедуру выполнить запрос, который вы хотите, а затем вызвать это из Нхиберната. Это позволит удалить избыточные запросы.