Mapping dei vincoli univoci dello schema XML (XSD) ai vincoli del 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 uno schema XML in uno schema relazionale (DataSet), il vincolo univoco specificato su un elemento o un attributo dello schema XML viene mappato a un vincolo univoco della DataTable nel DataSet corrispondente generato.

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

Nome attributo Descrizione
msdata:ConstraintName Se questo attributo viene specificato, il relativo valore viene utilizzato 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 riportato uno schema XML in cui l'elemento unique viene utilizzato 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 creazione del DataSet, lo schema viene letto dal processo di mapping, che genera la seguente tabella:

Customers (CustomerID, CompanyName, Phone)

Il processo di mapping consente inoltre di creare 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 specifica l'attributo facoltativo msdata:PrimaryKey dell'elemento unique e se ne imposta il valore su True, verrà creato il vincolo univoco per la tabella. La proprietà di colonna AllowDBNull 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 nello schema XML. Nell'esempio seguente viene mostrato come specificare che è necessario che una combinazione di valori CustomerID e CompanyName sia univoca per tutti i Customer in qualunque 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 viene riportato il vincolo creato nel DataSet risultante.

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

Vedere anche

Mapping dei vincoli dello schema XML (XSD) ai vincoli del DataSet | Generazione delle relazioni del DataSet da uno schema XML (XSD) | Supporto del tipo di dati tra i tipi XSD (XML Schema) e i tipi .NET Framework