代码之家  ›  专栏  ›  技术社区  ›  Aaronaught

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

  •  3
  • Aaronaught  · 技术社区  · 16 年前

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

    0 回复  |  直到 16 年前