Подтвердить что ты не робот

Игнорировать общедоступные/внутренние поля для NHibernate proxy

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

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

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

Можно ли сказать "игнорировать это поле"? Я использую Fluent NHibernate, если это облегчает процесс.

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

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

4b9b3361

Ответ 1

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

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

Fluently.Configure()
    .ExposeConfiguration(fun cfg -> 
        cfg.Properties.Add("use_proxy_validator", "false"))...

Ответ 3

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

[XmlIgnore]

чтобы украсить поля:)

Ответ 4

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

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

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

Ответ 5

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

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