Generazione delle relazioni del DataSet da uno schema XML (XSD)

In un DataSet è possibile stabilire un'associazione tra due o più colonne creando una relazione padre-figlio. Sono disponibili tre modalità di rappresentazione di una relazione DataSet all'interno di uno schema XSD (XML Schema Definition Language):

  • Specificare tipi complessi nidificati.
  • Utilizzare l'annotazione msdata:Relationship.
  • Specificare un xs:keyref senza l'annotazione msdata:ConstraintOnly.

Tipi complessi nidificati

Le definizioni di tipi complessi nidificati in uno schema indicano le relazioni padre-figlio degli elementi. Nel seguente frammento di schema XML viene mostrato che OrderDetail è un elemento figlio dell'elemento Order.

<xs:element name="Order">
  <xs:complexType>
     <xs:sequence>
        ...       <xs:element name="OrderDetail" /> <xs:complexType>
             ...
           </xs:complexType>
     </xs:sequence>
  </xs:complexType>
</xs:element>

Il processo di mapping dello schema XML consente di creare nel DataSet tabelle corrispondenti ai tipi complessi nidificati dello schema e di creare colonne aggiuntive, utilizzate come colonne padre-figlio per le tabelle generate. Si noti che tali colonne padre-figlio consentono di specificare relazioni, che non corrispondono a vincoli di chiave primaria/chiave esterna.

Annotazione msdata:Relationship

L'annotazione msdata:Relationship consente di specificare esplicitamente le relazioni padre-figlio tra gli elementi non nidificati di uno schema. Nell'esempio seguente viene mostrata la struttura dell'elemento Relationship.

<msdata:Relationship name="CustOrderRelationship" 
      msdata:parent="..." 
      msdata:child="..." 
      msdata:parentkey="..." 
      msdata:childkey="..." />

Gli attributi dell'annotazione msdata:Relationship consentono di identificare gli elementi coinvolti in una relazione padre-figlio, oltre agli elementi parentkey e childkey e gli attributi coinvolti nella relazione. Queste informazioni vengono utilizzate dal processo di mapping per generare tabelle nel DataSet e creare relazioni di chiave primaria/chiave esterna tra tali tabelle.

Nel seguente frammento di schema ad esempio vengono specificati gli elementi Order e OrderDetail allo stesso livello (non nidificati). Nello schema viene specificata un'annotazione msdata:Relationship, che consente di specificare la relazione padre-figlio tra i due elementi. In questo caso è necessario specificare una relazione esplicita mediante l'annotazione msdata:Relationship.

 <xs:element name="MyDataSet" msdata:IsDataSet="true">
  <xs:complexType>
    <xs:choice maxOccurs="unbounded">
        <xs:element name="OrderDetail">
          <xs:complexType>
            ...
          </xs:complexType>
       </xs:element>
       <xs:element name="Order">
          <xs:complexType>
            ...
          </xs:complexType>
       </xs:element>
    </xs:choice>
  </xs:complexType>

 </xs:element>
   <xs:annotation>     <xs:appinfo>       <msdata:Relationship name="OrdOrdDetailRelation"                                       msdata:parent="Order"                                        msdata:child="OrderDetail"                                        msdata:parentkey="OrderNumber"                                        msdata:childkey="OrderNo"/>     </xs:appinfo>  </xs:annotation>

L'elemento Relationship viene utilizzato dal processo di mapping per creare una relazione padre-figlio tra la colonna OrderNumber della tabella Order e la colonna OrderNo della tabella OrderDetail nel DataSet. Il processo di mapping consente solo di specificare la relazione. Non viene infatti specificato automaticamente alcun vincolo sui valori di tali colonne, a differenza di quanto avviene mediante i vincoli di chiave primaria/chiave esterna nei database relazionali. È possibile utilizzare elementi dello schema XML per specificare i vincoli in un DataSet, come descritto in Supporto dei tipi di dati tra i tipi dello schema XML (XSD) e i tipi di .NET Framework.

In questa sezione

Sezioni correlate