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

Nhibernate и свойства виртуального класса?

Просто прочитав о nHibernate, почему свойства класса должны быть виртуальными?

Какова причина этого?

4b9b3361

Ответ 1

Я бы посоветовал вам читать Должен ли быть виртуальным с NHibernate?

Быстрый ответ на этот вопрос: потому что нам нужно, чтобы участники были виртуальными для того, чтобы сделать нашу ленивую загрузку магия/вуду.

Более длинный ответ более интересен хоть. Важная особенность, которая реальный ORM должен быть прозрачным Lazy Загрузка. Если вы извлекаете объект через ORM, вы не хотите, чтобы он автоматически втягивать весь объект (по умолчанию все равно), но вы Не захотейте засорить свой код проверяет, не связаны ли определенные ассоциации еще загружены, а затем загрузка при необходимости. Это ORM обязанность. В идеале вы хотите иметь доступ к свойствам и ORM загружает необходимые данные на первый доступ к этим свойствам, если данные еще не получены.

Ответ 2

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

Ответ 3

Если вы не используете упомянутые методы, которые не являются виртуальными, вы можете просто добавить SetProperty следующего фрагмента:

 NHibernate.Cfg.Configuration cfg = new NHibernate.Cfg.Configuration().SetProperty(NHibernate.Cfg.Environment.UseProxyValidator, Boolean.FalseString)

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