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将使组件为null,但这似乎与此问题无关。
NHibernate是否不支持非公共组件属性,或者我在这里做错了什么?
另外,如果有人好奇的话,我已经使用了这个笨拙的变通方法,这样我就可以公开一个普通的香草不可变
IPAddress
属性在映射的
Host
类并将其转换为/从
IPAddressComponent
.基础数据库使用4字节字段。如果有更好的方法来进行这种映射,我欢迎任何建议;然而,我仍然需要回答这个问题,因为在其他情况下,它很容易出现。