NHibernate:将用户类型对象映射到单独的表

时间:2010-08-27 19:56:19

标签: nhibernate nhibernate-mapping

让我们从这个映射开始:

<component name="Location">
  ...
  <property name="Settings" type="JsonUserType,...">
    <column name="LocationSettingsType" />
    <column name="LocationSettingsData" />
  </property>
</component>

这映射到

TABLE Primary (
    ...
    LocationSettingsType,
    LocationSettingsData
    ...
)

class Location {
    ...
    object Settings { get; set; }
}

现在,我想将设置提取到一个单独的表中(因为它们很少在这里) 所以我得到了

TABLE Primary (
    ...
    LocationSettingsId,
    ...
)

TABLE Settings (
    Id,
    Type,
    Data
)

我可以保持我的C#类相同吗?

更新:这不是多对一关系。和以前一样,每个位置都有零个或一个设置,每个设置最多只能属于一个位置。

3 个答案:

答案 0 :(得分:0)

我认为最接近的是<map>映射元素;详细信息在this article中解释。

答案 1 :(得分:0)

如果要在Primary和Settings表上建立一对多关系,则必须先设置外键约束。然后,您将使用XML中的bag属性来映射表。每张桌子都有一个entity

另见NHibernate/FluentNHibernate Property Bag上的这个问题。

我还建议您购买NHibernate 2 for Beginners本书。它帮了我很多。

答案 2 :(得分:0)

这是一个老问题,但我有同样的问题,并期待我来到这里的解决方案。

component元素可以将多个列映射到多个对象模型。

join元素可以将多个表映射到对象模型。

主要问题是虽然component无法映射模型所属的其他表中的列,但join无法将不同的表列映射到不同的对象模型。

我找到的解决方案是使用两者来实现不同表的map列到几个对象:

<class name="Primary" table="Primary">
    <id name="Id">
        <generator class="identity"/>
    </id>
    <property name="Name" />
    ...
    <join table="Settings">
        <key column="PrimaryId"/>

        <component name="Location">
          ...
          <property name="Settings" type="JsonUserType,...">
            <column name="LocationSettingsType" />
            <column name="LocationSettingsData" />
          </property>
        </component>
    </join>
</class>

参考:

NHibernate Join mapping element

NHibernate Component mapping element