В документах для NHibernate четко указано, что свойства (и, я полагаю, по расширению, компонентов) с любым модификатором доступа могут быть сопоставлены. Тем не менее, это не то поведение, которое я наблюдаю, и мне интересно, может ли кто-нибудь сказать мне, является ли это моей ошибкой или это результат какого-то плохо документированного поведения в NHibernate.
Класс компонента (некоторые несущественные методы опущены):
public class IPAddressComponent
{
public virtual byte Octet1 { get; set; }
public virtual byte Octet2 { get; set; }
public virtual byte Octet3 { get; set; }
public virtual byte Octet4 { get; set; }
}
Содержащий класс:
public class Host
{
public virtual Guid ID { get; set; }
// snip a bunch of other auto-properties
// ...
protected internal virtual IPAddressComponent IPComponent { get; set; }
public virtual int Port { get; set; }
}
Отображение:
<class name="Host" table="Hosts">
<id name="ID" column="HostID">
<generator class="guid"/>
</id>
<component name="IPComponent">
<property name="Octet1" column="Host1"/>
<property name="Octet2" column="Host2"/>
<property name="Octet3" column="Host3"/>
<property name="Octet4" column="Host4"/>
</component>
<property name="Port"/>
</class>
Так что ... как есть, эта комбинация код / отображение не работает должным образом, HostComponent
всегда null
, когда я загружаю сущность. Однако, если я изменю модификатор доступа для этого свойства с protected internal
на public
, он заполняется нормально, что говорит мне о том, что нет никаких очевидных проблем с самим отображением. Мне известно о поведении, при котором NHibernate будет обнулять компонент, если все подчиненные свойства также будут нулевыми, но это, похоже, не связано с этой проблемой.
NHibernate не поддерживает непубличные свойства компонентов, или я что-то здесь не так делаю?
P.S. Если кому-то любопытно, я использовал этот неуклюжий обходной путь, чтобы я мог выставить неизменное свойство IPAddress
с простой ванилью в сопоставленном классе Host
и преобразовать в IPAddressComponent
. Базовая база данных использует 4-байтовые поля. Если есть лучший способ сделать это отображение, я приветствую любые предложения; однако мне все еще нужно ответить на этот конкретный вопрос, поскольку он может легко возникнуть при других обстоятельствах.