2010-04-29 2 views
1

У меня есть класс, созданный из WSDL, который имеет кучу публичных свойств и публичное событие. Я расширяю этот класс своим собственным и добавляю к нему некоторые свойства. Все мои собственные свойства объявлены virtual, но свойства базового класса не являются виртуальными.Предотвращение сопоставления всех открытых членов класса в Fluent NHibernate

Я использую класс классов Fluent NHibernate для отображения только свойств из моего расширенного класса. Как предотвратить (Fluent) NHibernate от попыток сохранить все публичные члены базового класса?

На данный момент, я получаю следующее исключение при создании ISessionFactory:

NHibernate.InvalidProxyTypeException: Следующие типы не могут быть использованы в качестве прокси-серверов:

Тип: Метод get_ <BaseClassProperty> должен быть «общественность/защищаемую виртуальная» или «внутренняя защищенная виртуальная»

типа: метод set_ <BaseClassProperty> должен быть «открытая/защищенной виртуальные» или «защищенной внутренней виртуальной»

...

Тип: Метод add_ <BaseClassEvent> должен быть 'открытый/защищаемой виртуальной' или 'защищенный внутренний виртуальный'

Тип: Метод remove_ <BaseClassEvent> должен быть 'открытый/защищенный виртуальный' или ' защищенный внутренний виртуальный '

ответ

3

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

Вам либо необходимо отключить ленивую загрузку и проксирование для объекта, либо (желательно!) Выставить DTO в своем WS, а не непосредственно на объект.

+0

Я не автор WS, поэтому я ничего не могу изменить с этой целью. Похоже, мне придется отключить ленивую загрузку. Благодарю. – alimbada

+0

Правильно ли отключить ленивую загрузку только для этого объекта, вызвав 'Not.LazyLoad()' в конструкторе ClassMap? Или есть лучший способ сделать это? Здесь, кажется, есть несколько способов сделать это здесь: http://stackoverflow.com/questions/1412002/fluent-nhibernate-r1-0-fluent-mapping-disable-lazy-load – alimbada

+1

'Not.LazyLoad()' в «ClassMap» - это самый простой способ пойти, если это только конкретные объекты, которые ему нужны; если это все, вы должны изучить соглашение (один из ответов в этом вопросе, с которым вы связаны, использует соглашение «DefaultLazy»). –

Смежные вопросы