Compartir a través de


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

En un esquema del lenguaje de definición de esquemas XML (XSD), el elemento único especifica la restricción de exclusividad en un elemento o atributo. En el proceso de traducir un esquema XML en un esquema relacional, la restricción única especificada en un elemento o atributo del esquema XML se asigna a una restricción única en el DataTable del DataSet correspondiente que se genera.

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

Nombre del atributo Descripción
msdata:ConstraintName Si se especifica este atributo, su valor se usa como nombre de restricción. De lo contrario, el atributo name proporciona el valor del nombre de restricción.
msdata:PrimaryKey Si PrimaryKey="true" está presente en el elemento único , se crea una restricción única con la propiedad IsPrimaryKey establecida en true.

En el ejemplo siguiente se muestra un esquema XML que usa el elemento único para especificar una restricción de unicidad.

<xs:schema id="SampleDataSet"
            xmlns:xs="http://www.w3.org/2001/XMLSchema"
            xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">  
  <xs:element name="Customers">  
    <xs:complexType>  
      <xs:sequence>  
        <xs:element name="CustomerID" type="xs:integer"
           minOccurs="0"/>  
        <xs:element name="CompanyName" type="xs:string"
           minOccurs="0"/>  
       <xs:element name="Phone" type="xs:string" />  
     </xs:sequence>  
   </xs:complexType>  
 </xs:element>  
  
 <xs:element name="SampleDataSet" msdata:IsDataSet="true">  
  <xs:complexType>  
    <xs:choice maxOccurs="unbounded">  
      <xs:element ref="Customers" />  
    </xs:choice>  
  </xs:complexType>  
   <xs:unique     msdata:ConstraintName="UCustID"     name="UniqueCustIDConstr" >       <xs:selector xpath=".//Customers" />       <xs:field xpath="CustomerID" />     </xs:unique>  
</xs:element>  
</xs:schema>  

El elemento único del esquema especifica que para todos los elementos Customers de una instancia de documento, el valor del elemento secundario CustomerID debe ser único. Al compilar el conjunto de datos, el proceso de asignación lee este esquema y genera la tabla siguiente:

Customers (CustomerID, CompanyName, Phone)  

El proceso de asignación crea también una restricción única para la columna CustomerID, como se muestra en el siguiente DataSet. (Por motivos de simplicidad, solo se muestran las propiedades pertinentes).

      DataSetName: MyDataSet  
TableName: Customers  
  ColumnName: CustomerID  
      AllowDBNull: True  
      Unique: True  
  ConstraintName: UcustID       Type: UniqueConstraint  
      Table: Customers  
      Columns: CustomerID
      IsPrimaryKey: False  

En el DataSet que se genera, la propiedad IsPrimaryKey se establece en False para la restricción única. La propiedad única de la columna indica que los valores de columna CustomerID deben ser únicos (pero pueden ser una referencia nula, según lo especificado por la propiedad AllowDBNull de la columna).

Si modifica el esquema y establece el valor de atributo msdata:PrimaryKey opcional en True, la restricción única se crea en la tabla. La propiedad de columna AllowDBNull se establece en False y la propiedad IsPrimaryKey de la restricción establecida en True, lo que convierte la columna CustomerID en una columna de clave principal.

Puede especificar una restricción única en una combinación de elementos o atributos en el esquema XML. En el ejemplo siguiente se muestra cómo especificar que una combinación de valores CustomerID y CompanyName deben ser únicos para todos los clientes de cualquier instancia agregando otro elemento xs:field en el esquema.

      <xs:unique
         msdata:ConstraintName="SomeName"
         name="UniqueCustIDConstr" >
  <xs:selector xpath=".//Customers" />
  <xs:field xpath="CustomerID" />
  <xs:field xpath="CompanyName" />
</xs:unique>  

Esta es la restricción que se crea en el dataset resultante.

ConstraintName: SomeName  
  Table: Customers  
  Columns: CustomerID CompanyName
  IsPrimaryKey: False  

Consulte también