如何使用NHibernate

时间:2016-06-22 18:41:46

标签: nhibernate nhibernate-mapping

考虑一个包含三个表的数据库: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文档没有描述这种情况。为每个类层次结构建立多表的正确方法是什么?

1 个答案:

答案 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>