Udostępnij przez


Ograniczenia schematu XML i relacje

W schemacie języka definicji schematu XML (XSD) można określić ograniczenia (ograniczenia unikatowe, klucz i keyref) i relacje (przy użyciu adnotacji msdata:Relationship ). W tym temacie wyjaśniono, jak ograniczenia i relacje określone w schemacie XML są interpretowane w celu wygenerowania elementu DataSet.

Ogólnie rzecz biorąc, w schemacie XML należy określić adnotację msdata:Relationship , jeśli chcesz wygenerować tylko relacje w zestawie danych. Aby uzyskać więcej informacji, zobacz Generowanie relacji zestawu danych na podstawie schematu XML (XSD). Należy określić ograniczenia (unikatowe, klucz i keyref), jeśli chcesz wygenerować ograniczenia w zestawie danych. Należy pamiętać, że ograniczenia kluczowe oraz odniesienia są również używane do generowania relacji, jak wyjaśniono w dalszej części tego tematu.

Generowanie relacji na podstawie ograniczeń klucza i referencji klucza

Zamiast określać adnotację msdata:Relationship, można określić ograniczenia klucza głównego i klucza podrzędnego, które są używane podczas procesu mapowania schematu XML w celu wygenerowania nie tylko tych ograniczeń, ale także relacji w DataSet. Jeśli jednak określisz msdata:ConstraintOnly="true" w elemencie keyref, DataSet będzie zawierać tylko ograniczenia i nie będzie zawierać relacji.

W poniższym przykładzie przedstawiono schemat XML zawierający elementy Order i OrderDetail, które nie są zagnieżdżone. Schemat określa również ograniczenia klucza i klucza odniesienia.

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

Element DataSet, który jest generowany podczas procesu mapowania schematu XML, obejmuje tabele Order i OrderDetail. Ponadto element DataSet zawiera relacje i ograniczenia. W poniższym przykładzie przedstawiono te relacje i ograniczenia. Należy pamiętać, że schemat nie określa adnotacji msdata:Relationship; zamiast tego ograniczenia klucz i kluczref są używane do generowania relacji.

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

W poprzednim przykładzie schematu elementy Order i OrderDetail nie są zagnieżdżone. W poniższym przykładzie schematu struktury te elementy są ze sobą zagnieżdżone. Nie określono jednak adnotacji msdata:Relationship ; w związku z tym zakłada się niejawną relację. Aby uzyskać więcej informacji, zobacz Zmapuj relacje niejawne między zagnieżdżonymi elementami schematu. Schemat określa również ograniczenia klucza i klucza odniesienia.

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

Powstały w wyniku procesu mapowania schematu XML DataSet obejmuje dwie tabele:

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

Zawiera DataSet również dwie relacje (jedną opartą na adnotacji msdata:relationship i drugą na podstawie ograniczeń klucza i klucza odwołania) oraz różne ograniczenia. W poniższym przykładzie przedstawiono relacje i ograniczenia.

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

Jeśli ograniczenie keyref odwołujące się do zagnieżdżonej tabeli zawiera adnotację msdata:IsNested="true", DataSet stworzy pojedynczą zależną relację opartą na ograniczeniu keyref i powiązanym ograniczeniu unikalnym/kluczowym.

Zobacz także