Есть ли случаи, когда NHibernate не возвращает прокси-объект? - PullRequest
2 голосов
/ 23 марта 2012

Я изучаю свободное владение NHibernate (и вообще, NHibernate).Я использую автоматическое сопоставление с некоторыми переопределениями, но я не думаю, что это важно для вопроса (конечно, если я ошибаюсь, я с удовольствием обновлю вопрос).

УчитываяISession (и еще несколько предполагаемых переменных) Я могу вернуть сущности по их идентификатору:

using (var session = SessionFactory.OpenSession())
{
    var user = session.Get<User>(userId);
}

Мое ограниченное понимание состояло в том, что NHibernate создает прокси вокруг сопоставленной сущности User, но когда я ее тестирую( на основе этого ):

Assert.That(user is INHibernateProxy, "Not a proxy.");

Кажется, что мой экземпляр не является прокси.

Есть ли случаи, когда прокси не используются? Я надеюсь на «недостающую часть» и молюсь, чтобы это не был мозговой сбой в пятницу днем.

Ответы [ 3 ]

3 голосов
/ 23 марта 2012

ISession.Get всегда возвращает либо null, либо реальный объект. ISession.Load OTOH может вернуть прокси (или выдать исключение), но прокси - это совсем другая история: ваши постоянные классы должны удовлетворять некоторым предварительным условиям (виртуальные свойства, незапечатанные и т. *

3 голосов
/ 23 марта 2012

Обычно прокси для отложенной загрузки.Всякий раз, когда вы получаете права по Get и т. Д., Вы получаете не прокси, а реальные объекты.NHibernate не использует прокси, когда в этом нет необходимости.

Но если user имеет Address, user.Address is INHibernateProxy будет истинным (если ленивая загрузка не отключена для этого отношения).* Для получения дополнительной информации о том, как и когда NHibernate обрабатывает прокси, см. эту статью .

0 голосов
/ 23 августа 2013

Как заявил NOtherDev, прокси предназначены для отложенной загрузки. Но даже Session.Get иногда возвращает прокси. Это застало меня врасплох несколько раз. Если вы используете отложенную загрузку для любого столбца в таблице, указав lazy="true", например:

<property name="Description" type="StringClob" not-null="false" lazy="true"/>

Session.Get всегда будет возвращать прокси для этого типа, и нет способа отменить прокси объекта. Фактически, прокси - это реальный объект.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...