Compartir a través de


Restricciones y relaciones de esquema XML

En un esquema del lenguaje de definición de esquema XML (XSD) puede especificar restricciones (unique, key y keyref) y relaciones (mediante la anotación msdata:Relationship). En este tema se explica cómo se interpretan las restricciones y relaciones especificadas en un esquema XML para generar .DataSet

En general, en un esquema XML, se especifica la anotación msdata:Relationship si desea generar solo relaciones en dataSet. Para obtener más información, vea Generar relaciones de conjuntos de datos a partir del esquema XML (XSD). Puede especificar restricciones (unique, key y keyref) si desea generar restricciones en el Conjunto de datos. Tenga en cuenta que las restricciones key y keyref también se usan para generar relaciones, como se explica más adelante en este tema.

Generación de una relación a partir de restricciones key y keyref

En lugar de especificar la anotación msdata:Relationship, puede especificar restricciones key y keyref que se utilizarán durante el proceso de asignación del esquema XML para generar no sólo las restricciones, sino también la relación en el DataSet. Sin embargo, si especifica msdata:ConstraintOnly="true" en el keyref elemento , incluirá DataSet solo las restricciones y no incluirá la relación.

En el ejemplo siguiente se muestra un esquema XML que incluye los elementos Order y OrderDetail que no están anidados. El esquema también especifica las restricciones key y 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>

El DataSet que se genera durante el proceso de asignación de esquemas XML incluye las tablas Order y OrderDetail. Además, el DataSet incluye relaciones y restricciones. En el ejemplo siguiente se muestran estas relaciones y restricciones. Tenga en cuenta que el esquema no especifica la anotación msdata:Relationship ; en su lugar, las restricciones key y keyref se usan para generar la relación.

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

En el ejemplo de esquema anterior, los elementos Order y OrderDetail no están anidados. En el siguiente ejemplo de esquema, estos elementos están anidados. Sin embargo, no se especifica ninguna anotación msdata:Relationship ; por lo tanto, se asume una relación implícita. Para obtener más información, vea Asignar relaciones implícitas entre elementos de esquema anidados. El esquema también especifica las restricciones key y 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>

El DataSet resultado del proceso de asignación de esquemas XML incluye dos tablas:

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

DataSet También incluye las dos relaciones (una basada en la anotación msdata:relationship y la otra basada en las restricciones de key y keyref) así como otras diversas restricciones. En el ejemplo siguiente se muestran las relaciones y restricciones.

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

Si una restricción keyref que hace referencia a una tabla anidada contiene la anotación DataSet creará una única relación anidada basada en la restricción keyref y la restricción unique/key relacionada.

Consulte también