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
,则会填充得很好,这告诉我映射本身并不是任何明显的问题。我知道如果所有子属性也为null,NHibernate将使组件为空的行为,但这似乎与此问题无关。
NHibernate不支持非公共组件属性,或者我在这里做错了什么?
P.S。如果有人好奇,我已经使用了这个笨拙的解决方法,因此我可以在映射的IPAddress
类中公开普通的不可变Host
属性并转换为/ IPAddressComponent
。底层数据库使用4字节字段。如果有更好的方法来进行这种映射,我欢迎任何建议;但是,我仍然需要回答这个问题,因为在其他情况下它很容易出现。