Compartilhar via


Relações e restrições de esquema XML

Em um esquema XSD (linguagem de definição de esquema XML), você pode especificar restrições (restrições exclusivas, de chave e de keyref) e relações (usando a anotação msdata:Relationship). Este tópico explica como as restrições e as 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, confira Como gerar relações de DataSet do esquema XML (XSD). Você especifica restrições (exclusivas, chave e keyref) se quiser gerar restrições no DataSet. Observe que as restrições chave e keyref também são usadas para gerar relações, conforme explicado posteriormente neste tópico.

Gerar uma relação de restrições de chave e keyref

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

O exemplo a seguir mostra um esquema XML que inclui elementos Order e OrderDetail, que não estão aninhados. O esquema também especifica restrições 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 gerado durante o processo de mapeamento de esquema XML inclui as tabelas Order e OrderDetail. Além disso, o DataSet inclui relações e restrições. O exemplo a seguir mostra esses relações e restrições. Observe que o esquema não especifica a anotação msdata:Relationship. Em vez disso, as restrições de chave 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 de esquema anterior, os elementos Order e OrderDetail não estão aninhados. No exemplo de esquema a seguir, esses elementos são aninhados. No entanto, nenhuma anotação msdata:Relationship é especificada. Portanto, uma relação implícita é assumida. Para obter mais informações, confira Mapear relações implícitas entre elementos de esquema aninhados. O esquema também especifica restrições 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 resultante do processo de mapeamento de esquema XML inclui duas tabelas:

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

O DataSet também inclui as duas relações (uma com base na anotação msdata:relationship e outra com base nas restrições chave e keyref), além de várias restrições. O exemplo a seguir mostra esses 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 referente a uma tabela aninhada contiver a anotação msdata:IsNested="true", o DataSet criará uma única relação aninhada baseada na restrição keyref e na restrição exclusiva/chave relacionada.

Confira também