Partilhar via


Restrições e relações do esquema XML

Em um esquema XSD (XML Schema Definition Language), você pode especificar restrições (restrições exclusivas, de chave e keyref) e relações (usando a anotação msdata:Relationship ). Este tópico explica como as restrições e relações especificadas em um esquema XML são interpretadas para gerar o DataSet.

Em geral, em um esquema XML, você especifica a anotação msdata:Relationship se quiser gerar apenas relações no DataSet. Para obter mais informações, consulte Gerando relações de conjunto de dados a partir do esquema XML (XSD). Você especifica restrições (unique, key e keyref) se quiser gerar restrições no DataSet. Observe que as restrições key e keyref também são usadas para gerar relações, conforme explicado mais adiante neste tópico.

Gerando um relacionamento a partir de restrições de chave e keyref

Em vez de especificar a anotação msdata:Relationship , você pode especificar restrições de chave e keyref, que são usadas durante o processo de mapeamento do esquema XML para gerar não apenas as restrições, mas também a relação no DataSet. No entanto, se especificar msdata:ConstraintOnly="true" no keyref elemento, o DataSet incluirá apenas as restrições e não incluirá a relação.

O exemplo seguinte mostra um Esquema XML que inclui os elementos Order e OrderDetail, que não estão aninhados. O esquema também especifica restrições de chave e 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>

O DataSet que é gerado durante o processo de mapeamento do XML Schema inclui as tabelas Order e OrderDetail. Além disso, o DataSet inclui relações e restrições. O exemplo a seguir mostra essas relações e restrições. Observe que o esquema não especifica a anotação msdata:Relationship ; em vez disso, as restrições key e keyref são usadas para gerar a relação.

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

No exemplo anterior do esquema, os elementos Order e OrderDetail não estão aninhados. No exemplo de esquema a seguir, estes elementos estão encaixados. No entanto, nenhuma anotação msdata:Relationship é especificada; portanto, assume-se uma relação implícita. Para obter mais informações, consulte Mapear relações implícitas entre elementos de esquema aninhados. O esquema também especifica restrições de chave e 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>

O DataSet resultado do processo de mapeamento de esquemas XML inclui duas tabelas:

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

O DataSet também inclui as duas relações (uma baseada na anotação msdata:relationship e outra nas restrições de chave e keyref) e vários outros constrangimentos. O exemplo a seguir mostra as relações e restrições.

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

Se uma restrição keyref referindo-se a uma tabela aninhada contiver a anotação msdata:IsNested="true", o DataSet criará uma relação aninhada única baseada na restrição keyref e na restrição única/chave relacionada.

Ver também