让我们从这个映射开始:
<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#类相同吗?
更新:这不是多对一关系。和以前一样,每个位置都有零个或一个设置,每个设置最多只能属于一个位置。
答案 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>
参考: