【发布时间】: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