У меня есть сопоставление один ко многим. Когда я пытаюсь получить родительский объект, дочерний объект также появляется, даже если я прекращаю ленивую загрузку в отображении. Я хочу получить только родительский объект, а не дочерние. Как мне это сделать?
Используйте свободный nhibernate для получения родительского объекта
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)
Очевидно, вы запускаете ленивую загрузку при отладке кода.
Если вы не уверены, что это значит, попробуйте понять это: -
- Вы ставите точку останова в своем коде
- Вы получаете родителя
- Visual Studio достигает точки останова
- Вы смотрите, загружены ли дети
- Отладчик визуальной студии идет и извлекает дочерние элементы для вас ‹- это то, что вызывает вашу ленивую загрузку. Наблюдая за этим в 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
на самом деле я использую полученный родительский объект для сохранения некоторых других дочерних элементов с помощью session.saveorupdate(Parent,child). Если ранее сохраненный дочерний элемент также извлекается, это вызывает проблему.
- person sovik banerjee; 27.07.2011