Freigeben über


Verstehen der Beziehung zwischen Einschränkungen und Beziehungen

In einem XML Schema Definition (XSD)-Sprachschema können Sie Einschränkungen (eindeutige, Schlüssel- und keyref-Einschränkungen) sowie Beziehungen (mit Hilfe der msdata:Relationship-Anmerkung) angeben. In diesem Thema wird erklärt, wie die Einschränkungen und Beziehungen, die in einem XML-Schema angegeben wurden, interpretiert werden, um das DataSet zu generieren.

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 einem XML-Schema (XSD). Geben Sie Einschränkungen (unique-, Schlüssel- und keyref-Einschränkungen) an, wenn Sie Einschränkungen in einem DataSet generieren möchten. Beachten Sie, dass die Schlüsseleinschränkung und keyref-Einschränkung auch zum Generieren von Beziehungen verwendet werden. Dies wird später in diesem Thema beschrieben.

Generieren einer Beziehung aus Schlüssel- 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 Einschränkungen, sondern auch die Beziehung im DataSet zu generieren. Wenn Sie jedoch msdata:ConstraintOnly="true" im keyref-Element angeben, enthält das DataSet nur die Einschränkungen und nicht die Beziehung.

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

<xs:schema id="MyDataSet"  
            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 während des XML-Schemazuordnungsprozesses generierte DataSet enthält die Tabellen Order und OrderDetail. Zusätzlich enthält das DataSet Beziehungen und Einschränkungen. Das folgende Beispiel verdeutlicht diese Beziehungen und Einschränkungen. Beachten Sie, dass das Schema die msdata:Relationship-Anmerkung nicht angibt. Stattdessen werden die Schlüsseleinschränkung und die keyref-Einschränkung zum Generieren der Beziehung verwendet.

....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 Elemente Order und OrderDetail nicht geschachtelt. Im folgenden Schemabeispiel sind diese Elemente geschachtelt. Jedoch ist die msdata:Relationship-Anmerkung nicht angegeben. Aus diesem Grund wird von einer impliziten Beziehung ausgegangen. Weitere Informationen finden Sie unter Zuordnen von impliziten Beziehungen zwischen geschachtelten Schemaelementen. Das Schema gibt auch Schlüssel- und keyref-Einschränkungen an.

<xs:schema id="MyDataSet"  
            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>

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

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

Das DataSet enthält auch zwei Beziehungen (eine basiert auf der msdata:relationship-Anmerkung und die zweite basiert auf den Schlüssel- und keyref-Einschränkungen) sowie verschiedene Einschränkungen. Das folgende Beispiel verdeutlicht 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 Anmerkung msdata:IsNested="true" enthält, erstellt das DataSet eine einzelne geschachtelte Beziehung, die auf der keyref-Einschränkung und der entsprechenden eindeutigen oder Schlüsseleinschränkung basiert.

Siehe auch

Generieren einer relationalen DataSet-Struktur aus einem XML-Schema (XSD)