【问题标题】:Mixing inheritance mapping strategies in NHibernate在 NHibernate 中混合继承映射策略
【发布时间】:2010-04-27 04:39:08
【问题描述】:

我有一个相当大的继承层次结构,其中一些子类添加的很少,而其他的添加很多。由于大小和层次结构的复杂性。理想情况下,我想混合映射策略,以便将子类添加很少的层次结构部分组合到一个公共表中,例如“每个类层次结构的表”,并且将添加很多的子类分解到一个单独的表中。使用这种方法,我希望有 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>

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

有没有办法做到这一点?

【问题讨论】:

    标签: .net nhibernate nhibernate-mapping


    【解决方案1】:

    您可能误读了该架构。它清楚地表明您可以使用任意数量的组件、属性和多对一。

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

    【讨论】:

    • ...如果我理解正确的话,“choice”的意思是只能使用choice元素中包含的一个子元素. MaxOccurs="unbounded" 意味着一个选项可以重复多次。因此,您可以拥有 50 个属性,但不能同时拥有属性和组件。我检查了几个 xsd 引用,这似乎就是他们所说的。
    • 我刚刚进行了一些测试,即使我只使用一种类型,我也会遇到错误,所以问题可能会更深。这是我在仅包含属性时得到的错误:“命名空间 'urn:nhibernate-mapping-2.2' 中的元素 'join' 在命名空间 'urn:nhibernate-mapping-2.2' 中具有无效的子元素 'property'。列表预期的可能元素:命名空间“urn:nhibernate-mapping-2.2”中的“子选择、注释、键”。”嗯……
    • 您收到该错误是因为您丢失了密钥。而且您之前对选择的解释是不正确的:您有“无限”的选择;如果您想要同一元素的多个实例,则必须将 MaxOccurs="unbounded" 放在元素中,而不是
    • 谢谢迭戈。你是对的。添加密钥消除了错误 - 即使我同时使用属性和组件。不幸的是,由于不可能在连接表中添加更多子类,因此这种方法仅适用于分解层次结构中的最后一层,这对我没有帮助。我不得不放弃这种方法,并且可能会为整个类层次结构使用一个表。这仍然允许域模型是细粒度的。这也意味着我不必为想要直接针对数据库的报告引擎创建糟糕的视图。 :)
    猜你喜欢
    • 2011-12-02
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    • 2012-04-17
    • 1970-01-01
    相关资源
    最近更新 更多