Compartir a través de


Asignar restricciones KEYREF de un esquema XML (XSD) a restricciones de conjuntos de datos

El elemento keyref permite establecer vínculos entre elementos dentro de un documento. Esto es similar a una relación de clave externa en una base de datos relacional. Si un esquema especifica el elemento keyref, durante el proceso de asignación del esquema el elemento se convertirá en una restricción de clave externa correspondiente en las columnas de las tablas del DataSet. De manera predeterminada, el elemento keyref genera también una relación donde se especifican las propiedades ParentTable, ChildTable, ParentColumn y ChildColumn.

En la siguiente tabla se describen los atributos msdata que puede especificar en el elemento keyref.

Nombre del atributo Descripción
msdata:ConstraintOnly Si se especificaConstraintOnly="true" en el elemento keyref del esquema, se crea una restricción, pero no se crea ninguna relación. Si no se especifica este atributo (o si se establece como Falso) tanto la restricción como la relación se crearán en el DataSet.
msdata:ConstraintName Si se especifica el atributo ConstraintName, su valor se utiliza como nombre de la restricción. De lo contrario, el atributo name del elemento keyref del esquema proporciona el nombre de restricción del DataSet.
msdata:UpdateRule Si se especifica el atributo UpdateRule en el elemento keyref del esquema, su valor se asigna a la propiedad de restricción UpdateRule del DataSet. De lo contrario, la propiedad UpdateRule se establece como Cascade.
msdata:DeleteRule Si se especifica el atributo DeleteRule en el elemento keyref del esquema, su valor se asigna a la propiedad de restricción DeleteRule del DataSet. De lo contrario, la propiedad DeleteRule se establece como Cascade.
msdata:AcceptRejectRule Si se especifica el atributo AcceptRejectRule en el elemento keyref del esquema, su valor se asigna a la propiedad de restricción AcceptRejectRule del DataSet. De lo contrario, la propiedad AcceptRejectRule se establece como None.

El ejemplo siguiente contiene un esquema que especifica las relaciones key y keyref entre el elemento secundario OrderNumber del elemento Order y el elemento secundario OrderNo del elemento OrderDetail.

En el ejemplo, el elemento secundario OrderNumber del elemento OrderDetail hace referencia al elemento secundario de clave OrderNo del elemento Order.

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

El proceso de asignación del esquema del lenguaje de definición de esquemas XML (XSD) crea el siguiente DataSet con dos tablas:

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

Además, el DataSet define las restricciones siguientes:

  • Una restricción única en la tabla Order.

              Table: Order  
    Columns: OrderNumber
    ConstraintName: OrderNumberKey  
    Type: UniqueConstraint  
    IsPrimaryKey: False  
    
  • Una relación entre las tablas Order y OrderDetail. La propiedad Nested se establece como False porque los dos elementos no están anidados en el esquema.

              ParentTable: Order  
    ParentColumns: OrderNumber
    ChildTable: OrderDetail  
    ChildColumns: OrderNo
    ParentKeyConstraint: OrderNumberKey  
    ChildKeyConstraint: OrderNoRef  
    RelationName: OrderNoRef  
    Nested: False  
    
  • Una restricción de clave externa en la tabla OrderDetail.

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

Consulte también