考虑一个包含三个表的数据库:PET,CAT和EXTENSION.CAT其中Pet是Cat的基类,Extension.Cat包含一个扩展表,其中包含Cat的其他属性。 Nhibernate允许使用以下内容对Pet - Cat关系进行建模:
<class name="Pet" table = "PET">
<id name="id" column="ID">...</id>
<property name="name"/>
<property name="age"/>
<joined-subclass name="Cat" table="CAT">
<key column="ID"/>
<property name="isMouser"/>
</joined-subclass> </class>
和Cat - CatEx这样的关系:
<class name="Cat" table="CAT">
<id name="id" column="ID">...</id>
<property name="isMouser"/>
<join table="CAT" schema="EXTENSION" >
<key column="ID"/>
<property name="fuzziness"/>
<property name="cuteness"/>
</join>
</class>
所以,虽然我认为以下内容应该有效,但它不会:
<class name="Pet" table = "PET">
<id name="id" column="ID">...</id>
<property name="name"/>
<property name="age"/>
<joined-subclass name="Cat" table="CAT">
<key column="ID" />
<property name="isMouser"/>
<join table="CAT" schema="EXTENSION" >
<key column="ID"/>
<property name="fuzziness"/>
<property name="cuteness"/>
</join>
</joined-subclass>
</class>
Nhibernate文档没有描述这种情况。为每个类层次结构建立多表的正确方法是什么?
答案 0 :(得分:0)
对此场景进行建模的正确方法是使用隐式多态模式。
<class name="Cat" table = "PET">
<id name="id" column="ID">...</id>
<property name="name"/>
<property name="age"/>
<join table="CAT">
<key column="id"/>
<property name="isMouser"/>
</join>
<join table="CAT" schema="EXTENSION" >
<key column="id"/>
<property name="fuzziness"/>
<property name="cuteness"/>
</join>
</class>
这里的关键因素是父表(PET)是引用的第一个表,尽管我们正在为Cat类建模。这种情况有效地为每个派生类提供了多个表。
一个潜在的问题是连接列名称不匹配,并且映射类中存在子表列的属性。 NHibernate要求这些额外的类属性具有映射。添加&#34; generated = insert&#34;,&#34; insert = false&#34;,&#34; update = false&#34;子表的属性的属性告诉NHibernate将属性设置为只读。
<class name="Cat" table = "PET">
<id name="petid" column="PETID">...</id>
<property name="name"/>
<property name="age"/>
<join table="CAT">
<key column="catid"/>
<property name="isMouser"/>
<property name="catid" generated="insert" insert="false" update="false" />
</join>
<join table="CAT" schema="EXTENSION" >
<key column="catexid"/>
<property name="fuzziness"/>
<property name="cuteness"/>
<property name="catexid" generated="insert" insert="false" update="false" />
</join>
</class>