XML 架构约束和关系

在 XML 架构定义语言 (XSD) 架构中,可以指定约束(唯一、键和 keyref 约束)和关系(使用 msdata:Relationship 注释)。 本主题说明如何解释 XML 架构中指定的约束和关系以生成 DataSet.

通常,在 XML 架构中,如果只想在数据集中生成关系,请指定 msdata:Relationship 注释。 有关详细信息,请参阅 从 XML 架构(XSD)生成数据集关系。 如果要在 数据集中生成约束,请指定约束(唯一、键和 keyref)。 请注意,密钥和 keyref 约束也用于生成关系,如本主题后面部分所述。

从键和 keyref 约束生成关系

不用指定 msdata:Relationship 注释,可以指定在 XML 架构映射过程中所使用的键和 keyref 约束,以便在数据集中既生成约束又生成关系。 但是,如果在keyref元素中指定msdata:ConstraintOnly="true",则DataSet只包含约束,而不包括关系。

以下示例显示了包含 OrderOrderDetail 未嵌套的元素的 XML 架构。 该架构还指定键约束和 keyref 约束。

<xs:schema id="MyDataSet" xmlns=""
            xmlns:xs="http://www.w3.org/2001/XMLSchema"
            xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">

 <xs:element name="MyDataSet" msdata:IsDataSet="true">
  <xs:complexType>
    <xs:choice maxOccurs="unbounded">
      <xs:element name="OrderDetail">
       <xs:complexType>
         <xs:sequence>
           <xs:element name="OrderNo" type="xs:integer" />
           <xs:element name="ItemNo" type="xs:string" />
         </xs:sequence>
       </xs:complexType>
      </xs:element>
      <xs:element name="Order">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="OrderNumber" type="xs:integer" />
            <xs:element name="EmpNumber" type="xs:integer" />
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:choice>
  </xs:complexType>

  <xs:key name="OrderNumberKey"  >
    <xs:selector xpath=".//Order" />
    <xs:field xpath="OrderNumber" />
  </xs:key>

  <xs:keyref name="OrderNoRef" refer="OrderNumberKey">
    <xs:selector xpath=".//OrderDetail" />
    <xs:field xpath="OrderNo" />
  </xs:keyref>
 </xs:element>
</xs:schema>

在 XML 架构映射过程中生成的DataSet包含OrderOrderDetail表。 此外,还包括 DataSet 关系和约束。 以下示例显示了这些关系和约束。 请注意,架构未指定 msdata:Relationship 注释;而是使用键和 keyref 约束来生成关系。

....ConstraintName: OrderNumberKey
....Type: UniqueConstraint
....Table: Order
....Columns: OrderNumber
....IsPrimaryKey: False

....ConstraintName: OrderNoRef
....Type: ForeignKeyConstraint
....Table: OrderDetail
....Columns: OrderNo
....RelatedTable: Order
....RelatedColumns: OrderNumber

..RelationName: OrderNoRef
..ParentTable: Order
..ParentColumns: OrderNumber
..ChildTable: OrderDetail
..ChildColumns: OrderNo
..ParentKeyConstraint: OrderNumberKey
..ChildKeyConstraint: OrderNoRef
..Nested: False

在前一个架构示例中,OrderOrderDetail 元素没有嵌套。 在以下架构示例中,这些元素是嵌套的。 但是,未指定 msdata:Relationship 批注;因此,假定隐式关系。 有关详细信息,请参阅 映射嵌套架构元素之间的隐式关系。 该架构还指定键约束和 keyref 约束。

<xs:schema id="MyDataSet" xmlns=""
            xmlns:xs="http://www.w3.org/2001/XMLSchema"
            xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">

 <xs:element name="MyDataSet" msdata:IsDataSet="true">
  <xs:complexType>
    <xs:choice maxOccurs="unbounded">

      <xs:element name="Order">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="OrderNumber" type="xs:integer" />
            <xs:element name="EmpNumber" type="xs:integer" />

            <xs:element name="OrderDetail">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="OrderNo" type="xs:integer" />
                  <xs:element name="ItemNo" type="xs:string" />
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:choice>
  </xs:complexType>

  <xs:key name="OrderNumberKey"  >
    <xs:selector xpath=".//Order" />
    <xs:field xpath="OrderNumber" />
  </xs:key>

  <xs:keyref name="OrderNoRef" refer="OrderNumberKey">
    <xs:selector xpath=".//OrderDetail" />
    <xs:field xpath="OrderNo" />
  </xs:keyref>
 </xs:element>
</xs:schema>

DataSet XML 架构映射过程生成的表包括两个表:

Order(OrderNumber, EmpNumber, Order_Id)
OrderDetail(OrderNumber, ItemNumber, Order_Id)

还包括 DataSet 两个关系(一个基于 msdata:relationship 注释,另一个基于键和 keyref 约束)和各种约束。 以下示例显示了关系和约束。

..RelationName: Order_OrderDetail
..ParentTable: Order
..ParentColumns: Order_Id
..ChildTable: OrderDetail
..ChildColumns: Order_Id
..ParentKeyConstraint: Constraint1
..ChildKeyConstraint: Order_OrderDetail
..Nested: True

..RelationName: OrderNoRef
..ParentTable: Order
..ParentColumns: OrderNumber
..ChildTable: OrderDetail
..ChildColumns: OrderNo
..ParentKeyConstraint: OrderNumberKey
..ChildKeyConstraint: OrderNoRef
..Nested: False

..ConstraintName: OrderNumberKey
..Type: UniqueConstraint
..Table: Order
..Columns: OrderNumber
..IsPrimaryKey: False

..ConstraintName: Constraint1
..Type: UniqueConstraint
..Table: Order
..Columns: Order_Id
..IsPrimaryKey: True

..ConstraintName: Order_OrderDetail
..Type: ForeignKeyConstraint
..Table: OrderDetail
..Columns: Order_Id
..RelatedTable: Order
..RelatedColumns: Order_Id

..ConstraintName: OrderNoRef
..Type: ForeignKeyConstraint
..Table: OrderDetail
..Columns: OrderNo
..RelatedTable: Order
..RelatedColumns: OrderNumber

如果引用嵌套表的 keyref 约束包含 msdata:IsNested=“true” 注释, DataSet 则会创建基于 keyref 约束和相关唯一/键约束的单个嵌套关系。

另请参阅