在NHibernate中混合继承映射策略

时间:2010-04-26 18:01:50

标签: .net nhibernate nhibernate-mapping

我有一个相当大的继承层次结构,其中一些子类添加很少,而其他子类添加了很多。我不想使用 “每个类层次结构的表”“每个子类的表”映射整个层次结构,因为它的大小和层次结构的复杂性。理想情况下,我想混合映射策略,使得子类添加很少的层次结构的部分组合成公共表和“每个类层次结构的表”,并且添加了很多的子类被分解为单独的表。使用这种方法,我希望有2或3个表浪费空间很少,而不是1个表,有很多字段不适用于大多数对象,或者20多个表,其中几个只有一个几列。

在NHibernate参考文档2.1.0版中,我找到了section 8.1.4 "Mixing table per class hierarchy with table per subclass"。此方法使用以下方法在层次结构中间切换策略:

...
<subclass ...>
    <join ...>
        <property ...>
        ...
    </join>
</subclass>
...

这在理论上很棒。但实际上,我发现架构在“join”元素中允许的内容限制太多,以至于我无法完成所需的操作。

以下是架构定义的相关部分:

<xs:element name="join">
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="subselect" minOccurs="0" />
            <xs:element ref="comment" minOccurs="0" />
            <xs:element ref="key" />
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element ref="property" />
                <xs:element ref="many-to-one" />
                <xs:element ref="component" />
                <xs:element ref="dynamic-component" />
                <xs:element ref="any" />
                <xs:element ref="map" />
                <xs:element ref="set" />
                <xs:element ref="list" />
                <xs:element ref="bag" />
                <xs:element ref="idbag" />
                <xs:element ref="array" />
                <xs:element ref="primitive-array" />
            </xs:choice>
            <xs:element ref="sql-insert" minOccurs="0" />
            <xs:element ref="sql-update" minOccurs="0" />
            <xs:element ref="sql-delete" minOccurs="0" />
        </xs:sequence>
        <xs:attribute name="table" use="required" type="xs:string" />
        <xs:attribute name="schema" type="xs:string" />
        <xs:attribute name="catalog" type="xs:string" />
        <xs:attribute name="subselect" type="xs:string" />
        <xs:attribute name="fetch" default="join">
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:enumeration value="join" />
                    <xs:enumeration value="select" />
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="inverse" default="false" type="xs:boolean">
        </xs:attribute>
        <xs:attribute name="optional" default="false" type="xs:boolean">
        </xs:attribute>
    </xs:complexType>
</xs:element>

如您所见,这允许使用“property”子元素或“component”子元素 ,但不能同时使用 。它也不允许“子类”子元素继续在策略更改点之下的层次结构。

有没有办法实现这个目标?

1 个答案:

答案 0 :(得分:0)

您可能误读了该架构。它清楚地表明您可以根据需要使用尽可能多的组件,属性和多对一。

不,不可能在其中添加更多的子类策略。