Используйте свободный nhibernate для получения родительского объекта

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


person sovik banerjee    schedule 27.07.2011    source источник
comment
По моему опыту, независимо от того, что вы говорите NHibernate о ленивой загрузке, если вы обращаетесь к дочернему объекту, пока сеанс активен, он будет лениво загружать дочерний объект. Если вы получите к нему доступ, когда сеанс неактивен, он завершится ошибкой с исключением...   -  person sinelaw    schedule 27.07.2011
comment
так есть другой выход? по крайней мере, если я могу получить нулевой список своих дочерних объектов?   -  person sovik banerjee    schedule 27.07.2011
comment
В NHinbernate есть параметр с именем access, попробуйте установить access=none на одной стороне отношения «один ко многим» и удалить дочернее свойство из класса.   -  person Filip    schedule 27.07.2011
comment
Вы можете навсегда отключить одну сторону ссылки (не сопоставляя родительский элемент с дочерним, делая его односторонним, или используя что-то вроде того, что предложил Филип). В моем случае я иногда хочу получить доступ к дочерним элементам, а иногда нет, и при этом использую активную загрузку. Мне пришлось потратить много, много часов, чтобы добиться этого. В итоге я обернул объекты NHibernate специальным прокси-сервером, который возвращает null, когда вы пытаетесь получить доступ к свойствам, которые не были выбраны в исходном запросе (прокси-сервер предотвращает ленивую загрузку и вместо этого возвращает null). Возможно, когда-нибудь я выложу источник, но сейчас это немного беспорядок.   -  person sinelaw    schedule 27.07.2011
comment
Я попробовал то, что предложил Филипп, но в моем случае это все еще не работает.   -  person sovik banerjee    schedule 27.07.2011
comment
Когда вы говорите, что это происходит, откуда вы знаете, что это происходит? вы а) смотрите только на сгенерированный SQL или б) используете отладку и видите, что там?   -  person Rippo    schedule 27.07.2011
comment
@Rippo, использующий дочерние объекты отладчика, также извлекается.   -  person sovik banerjee    schedule 27.07.2011
comment
Когда отладчик получает доступ к свойству коллекции, срабатывает отложенная загрузка. если вы не используете отладчик и проверяете, инициализирована ли коллекция (см. мой ответ), вы увидите не загруженный. было бы полезно, если бы вы добавили свой вариант использования к вопросу   -  person Firo    schedule 27.07.2011
comment
@sovik, поэтому ленивая загрузка запускается, когда вы просматриваете коллекцию во время отладки! это твой ответ   -  person Rippo    schedule 27.07.2011


Ответы (2)


Очевидно, вы запускаете ленивую загрузку при отладке кода.

Если вы не уверены, что это значит, попробуйте понять это: -

  1. Вы ставите точку останова в своем коде
  2. Вы получаете родителя
  3. Visual Studio достигает точки останова
  4. Вы смотрите, загружены ли дети
  5. Отладчик визуальной студии идет и извлекает дочерние элементы для вас ‹- это то, что вызывает вашу ленивую загрузку. Наблюдая за этим в VS, вы форсируете ленивую загрузку.

Если вы все еще не уверены, добавьте профилировщик SQL, используйте ведение журнала через log4net или даже загрузите NHProf (бесплатно в течение 30 дней) и посмотрите сгенерированный sql с точкой останова, а затем без нее, и вы увидите различия.

ХТН

person Rippo    schedule 27.07.2011

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

var pc = Parent.Childs as IPersistentCollection;
if (pc != null && !pc.WasInitialized)
    Parent.Childs = null;
person Firo    schedule 27.07.2011
comment
на самом деле я использую полученный родительский объект для сохранения некоторых других дочерних элементов с помощью session.saveorupdate(Parent,child). Если ранее сохраненный дочерний элемент также извлекается, это вызывает проблему. - person sovik banerjee; 27.07.2011