Игнорировать публичные / внутренние поля для прокси NHibernate - PullRequest
18 голосов
/ 12 апреля 2009

У меня есть несколько типов сущностей, которые я бы хотел загружать. Однако у них есть некоторые внутренние (сборочные) поля, которые они предоставляют, но не используются вне этого класса. Эти поля генерируются компилятором (F #), и я не могу их изменить. Пример исключения:

NHibernate.InvalidProxyTypeException: Следующие типы не могут быть использованы как прокси: Mappings.MTest: идентификатор поля @ 47 не должно быть ни публичным, ни внутренним

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

Есть ли способ сказать "игнорируй это поле"? Я использую Fluent NHibernate, если так будет проще.

Редактировать: Я также должен отметить, что я использую NHibernate 2.1.0 Alpha 2.

Edit2: Основная суть здесь в том, что я хочу оставить LazyLoading включенным, что означает, что мне нужно использовать генерацию прокси. Отключение LazyLoading работает (без прокси), но в сорте побеждает назначение хороших фреймворков, таких как NHibernate.

Ответы [ 5 ]

17 голосов
/ 12 апреля 2009

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

Edit: Ах, есть свойство "use_proxy_validator", которое отключит все проверки правильности. Достаточно хорошо.

Fluently.Configure()
    .ExposeConfiguration(fun cfg -> 
        cfg.Properties.Add("use_proxy_validator", "false"))...
5 голосов
/ 02 августа 2011

Просто установите для свойства lazy значение false,

 <class name="OrderLine" table="OrderLine" lazy="false" >

Вы можете прочитать больше в: Все должно быть виртуальным с NHibernate? - http://davybrion.com/blog/2009/03/must-everything-be-virtual-with-nhibernate/

Офир, www.TikalK.com

1 голос
/ 13 апреля 2009

Можно ли использовать интерфейс для объявления полей "используется"? http://nhibernate.info/doc/nh/en/index.html#persistent-classes-poco-sealed

«Еще одна возможность для класса реализовать интерфейс, который объявляет всех открытых членов»

Я не знаю, использует ли NH ту же аннотацию / атрибут @transient, что и версия JAVA, чтобы игнорировать свойство в постоянных операциях.

1 голос
/ 12 апреля 2009

Вы можете использовать

[XmlIgnore]

атрибут для оформления полей:)

0 голосов
/ 12 апреля 2009

Возможно, вы захотите взглянуть на эту страницу , которая дает обзор использования F # с Fluent NHibernate.

Редактировать Я только что заметил ваше имя пользователя. Правильно ли я думаю, что это ваш блог? Как глупо с моей стороны. Похоже, это действительно решает вашу проблему, а именно: «Мы начинаем с отключения LazyLoad, потому что большинство свойств не являются виртуальными, и NHibernate не сможет проверить сопоставление. Вместо этого мы явно используем LazyLoad, например, ссылку Store». Может быть, я просто неправильно понимаю проблему.

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