NHibernate требует, чтобы события были виртуальными? - PullRequest
2 голосов
/ 15 апреля 2009

Я пытаюсь отобразить иерархию объектов, используя NHibernate, почти во всех из которых есть события. Однако при попытке создать фабрику сеансов я получаю сообщения об ошибках, подобные следующим:

Core.Domain.Entities.Delivery: метод remove_Scheduled должно быть виртуальным

Доставка - это объект в моей доменной модели с событием под названием Запланированный . Поскольку события не могут быть объявлены виртуальными, я не знаю, как действовать здесь. Зачем NHibernate нужно, чтобы события были виртуальными?

Ответы [ 3 ]

2 голосов
/ 15 апреля 2009

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

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

И есть другое решение. Вы можете добавить proxy="ISomeInterface" к объявлению класса. Тогда вам не нужны виртуальные члены, в то время как прокси просто реализуют данный интерфейс.

1 голос
/ 03 июня 2009

У меня возникла та же проблема с реализацией INotifyPropertyChanged для моих лениво загруженных объектов. Проблема в том, что вы на самом деле имеете дело с двумя разными экземплярами .NET, поэтому при запуске события NPC в вашем реальном экземпляре вы не получите его от какой-либо ссылки на прокси. Сделав его виртуальным, прокси может «переслать» это событие. К сожалению, определить события как виртуальные / переопределяемые невозможно в VB.NET (2005), и, следовательно, нам пришлось представить проект C # с базовым классом, реализующим только эти виртуальные события, просто чтобы обойти проблему VB. см. также https://forum.hibernate.org/viewtopic.php?f=25&t=990162&start=0

Если есть другие способы, которыми я бы хотел узнать себя, так как наш метод делает прокси чуть менее прозрачными, чем они должны быть. Также в области автоматического переподключения сеанса, когда лениво загруженные объекты должны быть инициализированы, кажется немного болезненным.

С уважением, Тео

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

как выглядит ваше отображение? Вы отобразили событие?

Я не сталкивался с этой проблемой раньше, но, с другой стороны, я всегда указываю атрибут 'lazy = false' в моем отображении классов, чтобы мои свойства не нужно было объявлять как виртуальные. (Поскольку я не люблю объявлять свойства как виртуальные, если моя бизнес-модель этого не требует)

<class name="MyClass" table="MyTable" lazy="false">
</class>
...