Partilhar via


Mapear Restrições de Keyref do Esquema XML (XSD) para Restrições de Conjunto de Dados

O keyref elemento permite-lhe estabelecer ligações entre elementos dentro de um documento. Isso é semelhante a uma relação de chave estrangeira em um banco de dados relacional. Se um esquema especificar o keyref elemento, o elemento é convertido durante o processo de mapeamento do esquema para uma restrição de chave estrangeira correspondente nas colunas das tabelas de DataSet. Por padrão, o keyref elemento também gera uma relação, com ParentTable, ChildTable, ParentColumn e ChildColumn propriedades especificadas na relação.

A tabela seguinte descreve os msdata atributos que pode especificar no keyref elemento.

Nome do atributo Descrição
msdata:ConstraintOnly Se ConstraintOnly="true" for especificado no keyref elemento do esquema, é criada uma restrição, mas nenhuma relação é criada. Se esse atributo não for especificado (ou estiver definido como False), a restrição e a relação serão criadas no DataSet.
msdata:ConstraintName Se o ConstraintName atributo for especificado, o seu valor é usado como nome da restrição. Caso contrário, o name atributo do keyref elemento no esquema fornece o nome da restrição no DataSet.
msdata:UpdateRule Se o UpdateRule atributo for especificado no keyref elemento do esquema, o seu valor é atribuído à UpdateRule propriedade de restrição no DataSet. Caso contrário, a UpdateRule propriedade está definida para Cascata.
msdata:DeleteRule Se o DeleteRule atributo for especificado no keyref elemento do esquema, o seu valor é atribuído à DeleteRule propriedade de restrição no DataSet. Caso contrário, a DeleteRule propriedade está definida para Cascata.
msdata:AcceptRejectRule Se o AcceptRejectRule atributo for especificado no keyref elemento do esquema, o seu valor é atribuído à AcceptRejectRule propriedade de restrição no DataSet. Caso contrário, a AcceptRejectRule propriedade está definida para Nenhuma.

O exemplo seguinte contém um esquema que especifica as relações de key e keyref entre o elemento filho OrderNumber do elemento Order e o elemento filho OrderNo do elemento OrderDetail.

No exemplo, o OrderNumber elemento filho do OrderDetail elemento refere-se ao OrderNo elemento filho-chave do Order elemento.

<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 processo de mapeamento de esquemas da XML Schema Definition Language (XSD) produz o seguinte DataSet com duas tabelas:

OrderDetail(OrderNo, ItemNo) and
Order(OrderNumber, EmpNumber)

Além disso, define DataSet as seguintes restrições:

  • Uma restrição única na Order tabela.

              Table: Order
    Columns: OrderNumber
    ConstraintName: OrderNumberKey
    Type: UniqueConstraint
    IsPrimaryKey: False
    
  • Uma relação entre as Order e OrderDetail tabelas. A propriedade Nested é definida para False porque os dois elementos não estão aninhados no esquema.

              ParentTable: Order
    ParentColumns: OrderNumber
    ChildTable: OrderDetail
    ChildColumns: OrderNo
    ParentKeyConstraint: OrderNumberKey
    ChildKeyConstraint: OrderNoRef
    RelationName: OrderNoRef
    Nested: False
    
  • Uma restrição de chave estrangeira na tabela OrderDetail.

              ConstraintName: OrderNoRef
    Type: ForeignKeyConstraint
    Table: OrderDetail
    Columns: OrderNo
    RelatedTable: Order
    RelatedColumns: OrderNumber
    

Ver também