Игнорировать общедоступные/внутренние поля для NHibernate proxy
У меня есть некоторые типы сущностей, которые я хотел бы ленить. Однако они имеют некоторые внутренние (сборочные) поля, которые они выставляют, но не используются вне этого класса. Эти поля генерируются компилятором (F #), и я не могу их изменить. Исключением для примера является:
NHibernate.InvalidProxyTypeException: Следующие типы не могут использоваться как прокси: Mappings.MTest: поле id @47 не должно быть общедоступным и внутренним.
Я понимаю, почему NHibernate делает это, и как использование полей, если бы я обращался к ним, испортило бы ленивые свойства создаваемых прокси. Однако, поскольку я знаю, что не буду использовать поля, могу ли я как-то переопределить NHibernate?
Можно ли сказать "игнорировать это поле"? Я использую Fluent NHibernate, если это облегчает процесс.
Изменить: также следует отметить, что я использую NHibernate 2.1.0 Alpha 2.
Edit2: Основной смысл заключается в том, что я хочу включить LazyLoading, что означает, что я должен использовать генерацию прокси. Отключение LazyLoading работает (без прокси), но sorta поражает цель хорошей инфраструктуры, такой как NHibernate.
Ответы
Ответ 1
Я собрал NHibernate (проще, чем получить исходный код и перестроить), и удалил код, содержащий ошибки во внутренних/общедоступных полях. LazyLoading работает нормально, без этой проверки. (Хотя, я новичок в NHibernate, и поэтому есть, вероятно, сценарии, о которых я не знаю.)
Edit:
Ах, есть свойство "use_proxy_validator", которое отключит все проверки проверки. Достаточно хорошо.
Fluently.Configure()
.ExposeConfiguration(fun cfg ->
cfg.Properties.Add("use_proxy_validator", "false"))...
Ответ 2
Просто установите для свойства 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
Ответ 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, например, ссылку на хранилище".? Возможно, я просто неправильно понимаю проблему.