#c# #nhibernate
#c# #nhibernate
Вопрос:
Раньше было возможно сопоставлять автоматические свойства с частными настройщиками с помощью NHibernate, но начиная с версии 3.2 это больше не так (не без замены средства проверки сущности), см. Обсуждение NH dev.
Я понимаю protected
требование, но почему internal
? Это нарушает инкапсуляцию и просто кажется грязным.
Является ли единственной альтернативой возврат к резервным полям?
ОБНОВЛЕНИЕ: смущающее, но верное, оказывается internal
, не требуется. Итак, это выбор между возвратом к резервным полям или использованием защищенного установщика и либо избеганием установки значений в конструкторе, либо риском появления трудно отслеживаемых ошибок. Спасибо Fabio и @Nexus за указание на мою ошибку.
Комментарии:
1. вы имели в виду «почему
virtual
» вместо «почемуinternal
«?2. нет, я имел в виду почему,
protected internal
а не простоprotected
, если я не могу иметьprivate
.3. хорошо, меня ввело в заблуждение оригинальное название…
Ответ №1:
Майкл,
public string Foo { get; protected set; }
все еще должно быть возможно, обсуждение разработчиков касается public string Foo { get; private set; }
того, что может привести к ошибкам при использовании отложенных свойств.
Комментарии:
1. Средство проверки прокси использует MethodBase. IsFamilyOrAssembly, поэтому internal ИЛИ protected должны работать, но я не думаю, что для этого нужны оба.
2. Я почти уверен, что я это тестировал, но если вы правы, это было бы ошибкой. Приводит к некоторому.
3. Протестировано и обновило вопрос с результатами (вы были правы, спасибо!)
Ответ №2:
NHibernate довольно грязный. Он использует отражение для доступа к свойствам и полям.
Вы даже можете отображать private
свойства и поля как точки данных.
NHibernate полностью игнорирует видимость элементов, к которым ему необходимо получить доступ.
Комментарии:
1. Пауло, как бы ты сопоставил это с NH 3.2:
public string Foo { get; private set; }
?2. Я совершенно не помню код NHbiernate, который запрашивает средство получения и установки свойства. Это можно было бы сделать, но я не уверен.
Ответ №3:
public class Class{
public string Foo { get; private set; }
}
Property(class=> class.Foo);
Затем вам нужно будет отключить проверку прокси-сервера в вашей конфигурации:
Config.Proxy(p => {p.Validation = false});