Mapping tra vincoli XML Schema (XSD) univoci e vincoli di dataset

In uno schema XSD (XML Schema Definition Language), l'elemento unique consente di specificare il vincolo di univocità su un elemento o un attributo. Durante il processo di conversione di un XML Schema in uno schema relazionale, viene eseguito il mapping del vincolo univoco specificato su un elemento o un attributo dell'XML Schema a un vincolo univoco del tipo DataTable nel tipo DataSet corrispondente generato.

Nella tabella seguente vengono brevemente descritti gli attributi msdata che è possibile specificare per l'elemento unique.

Attribute name Descrizione
msdata:ConstraintName Se questo attributo viene specificato, il relativo valore viene usato come nome del vincolo. In caso contrario, il valore per il nome del vincolo viene fornito dall'attributo name.
msdata:PrimaryKey Se PrimaryKey="true" è presente nell'elemento unique, viene creato un vincolo univoco la cui proprietà IsPrimaryKey è impostata su true.

Nell'esempio seguente viene illustrato un XML Schema in cui l'elemento unique viene usato per specificare un vincolo di univocità.

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

L'elemento unique dello schema consente di specificare che è necessario che il valore dell'elemento figlio CustomerID sia univoco per tutti gli elementi Customers in un'istanza del documento. Durante la compilazione dell'oggetto DataSet, lo schema viene letto dal processo di mapping, che genera la seguente tabella:

Customers (CustomerID, CompanyName, Phone)  

Il processo di mapping crea inoltre un vincolo univoco nella colonna CustomerID, come illustrato nel seguente DataSet. Per semplicità vengono mostrate solo le proprietà rilevanti.

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

Nel DataSet generato la proprietà IsPrimaryKey viene impostata su False per il vincolo univoco. La proprietà unique per la colonna indica che è necessario che i valori della colonna CustomerID siano univoci, ma per tali valori sono consentiti riferimenti null, come specificato nella proprietà AllowDBNull della colonna.

Se si modifica lo schema e si imposta il valore dell'attributo facoltativo msdata:PrimaryKey su True, verrà creato il vincolo univoco per la tabella. La proprietà AllowDBNull della colonna viene impostata su False e la proprietà IsPrimaryKey del vincolo viene impostata su True, rendendo quindi la colonna CustomerID una colonna di chiave primaria.

È possibile specificare un vincolo univoco per una combinazione di elementi o attributi nell'XML Schema. Nell'esempio seguente viene illustrato come specificare che è necessario che una combinazione di valori CustomerID e CompanyName sia univoca per tutti gli elementi Customers in qualsiasi istanza mediante l'aggiunta di un elemento xs:field nello schema.

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

Di seguito è riportato il vincolo creato nell'oggetto DataSet risultante.

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

Vedi anche