NHibernate中的受保护和/或内部组件属性

时间:2009-12-24 00:00:14

标签: nhibernate components

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字节字段。如果有更好的方法来进行这种映射,我欢迎任何建议;但是,我仍然需要回答这个问题,因为在其他情况下它很容易出现。

0 个答案:

没有答案