Freigeben über


XML-Schemaeinschränkungen und -beziehungen

In einem XSD-Schema (XML Schema Definition Language) können Sie Einschränkungen (eindeutige, Schlüssel- und Keyref-Einschränkungen) und Beziehungen (mithilfe der Msdata:Relationship-Anmerkung ) angeben. Dieses Thema erläutert, wie die in einem XML-Schema angegebenen Einschränkungen und Beziehungen umgewandelt werden, um das DataSet zu erstellen.

Im Allgemeinen geben Sie in einem XML-Schema die Msdata:Relationship-Anmerkung an, wenn Sie nur Beziehungen im DataSet generieren möchten. Weitere Informationen finden Sie unter Generieren von DataSet-Beziehungen aus dem XML-Schema (XSD). Sie geben Einschränkungen (eindeutig, schlüssel und keyref) an, wenn Sie Einschränkungen im DataSet generieren möchten. Beachten Sie, dass die Schlüssel- und Keyref-Einschränkungen auch zum Generieren von Beziehungen verwendet werden, wie weiter unten in diesem Thema erläutert.

Generieren einer Beziehung aus Schlüsseleinschränkungen und "keyref"-Einschränkungen

Anstatt die Msdata:Relationship-Anmerkung anzugeben, können Sie Schlüssel- und Keyref-Einschränkungen angeben, die während des XML-Schemazuordnungsprozesses verwendet werden, um nicht nur die Einschränkungen, sondern auch die Beziehung im DataSet zu generieren. Wenn Sie jedoch msdata:ConstraintOnly="true" im keyref-Element angeben, enthält dieses nur die Einschränkungen und schließt die Beziehung DataSet nicht ein.

Das folgende Beispiel zeigt ein XML-Schema, das die Elemente Order und OrderDetail enthält, die nicht geschachtelt sind. Das Schema gibt außerdem Schlüssel- und Keyref-Einschränkungen an.

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

Das DataSet , das während des XML-Schemazuordnungsprozesses generiert wird, enthält die Order und OrderDetail Tabellen. Darüber hinaus umfasst das DataSet Beziehungen und Einschränkungen. Das folgende Beispiel zeigt diese Beziehungen und Einschränkungen. Beachten Sie, dass das Schema die msdata:Relationship-Anmerkung nicht angibt. Stattdessen werden die Schlüssel- und Keyref-Einschränkungen verwendet, um die Beziehung zu generieren.

....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

Im vorherigen Schemabeispiel sind die Order- und OrderDetail-Elemente nicht verschachtelt. Im folgenden Schemabeispiel werden diese Elemente geschachtelt. Es wird jedoch keine msdata:Relationship-Anmerkung angegeben; daher wird eine implizite Beziehung angenommen. Weitere Informationen finden Sie unter Zuordnung impliziter Beziehungen zwischen geschachtelten Schemaelementen. Das Schema gibt außerdem Schlüssel- und Keyref-Einschränkungen an.

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

Der DataSet aus dem XML-Schemazuordnungsprozess resultierende Prozess enthält zwei Tabellen:

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

Dazu DataSet gehören auch die beiden Beziehungen (eine basierend auf der msdata:relationship-Anmerkung und die andere basierend auf den Schlüssel- und keyref-Einschränkungen) sowie verschiedene Einschränkungen. Das folgende Beispiel zeigt die Beziehungen und Einschränkungen.

..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

Wenn eine Keyref-Einschränkung, die auf eine geschachtelte Tabelle verweist, die msdata:IsNested="true"- Anmerkung enthält, erstellt dies DataSet eine einzelne geschachtelte Beziehung, die auf der Keyref-Einschränkung und der zugehörigen Eindeutig/Schlüsseleinschränkung basiert.

Siehe auch