Mapping tra vincoli keyref XML Schema (XSD) e vincoli di dataset
L'elemento keyref consente di stabilire collegamenti tra gli elementi all'interno di un documento. Questo elemento ha quindi una funzione simile a quella della relazione di chiave esterna in un database relazionale. Se in uno schema viene specificato l'elemento keyref, durante il processo di mapping dello schema l'elemento viene convertito in un vincolo di chiave esterna corrispondente per le colonne delle tabelle del DataSet. Per impostazione predefinita, l'elemento keyref genera anche una relazione, con le proprietà ParentTable, ChildTable, ParentColumn e ChildColumn specificate nella relazione.
Nella tabella seguente vengono brevemente descritti gli attributi msdata che è possibile specificare per l'elemento keyref.
Attribute name | Descrizione |
---|---|
msdata:ConstraintOnly | Se è specificato ConstraintOnly="true" nell'elemento keyref dello schema, verrà creato un vincolo ma nessuna relazione. Se questo attributo non viene specificato (o è impostato su False), nel DataSet vengono creati sia il vincolo che la relazione. |
msdata:ConstraintName | Se è specificato l'attributo ConstraintName, il relativo valore viene usato come nome del vincolo. In caso contrario, l'attributo name dell'elemento keyref nello schema fornisce il nome del vincolo nel DataSet. |
msdata:UpdateRule | Se viene specificato l'attributo UpdateRule nell'elemento keyref dello schema, il relativo valore viene assegnato alla proprietà di vincolo UpdateRule nel DataSet. In caso contrario, la proprietà UpdateRule viene impostata su Cascade. |
msdata:DeleteRule | Se viene specificato l'attributo DeleteRule nell'elemento keyref dello schema, il relativo valore viene assegnato alla proprietà di vincolo DeleteRule nel DataSet. In caso contrario, la proprietà DeleteRule viene impostata su Cascade. |
msdata:AcceptRejectRule | Se viene specificato l'attributo AcceptRejectRule nell'elemento keyref dello schema, il relativo valore viene assegnato alla proprietà di vincolo AcceptRejectRule nel DataSet. In caso contrario, la proprietà AcceptRejectRule viene impostata su None. |
Nell'esempio seguente viene riportato uno schema in cui vengono specificate le relazioni key e keyref tra l'elemento figlio OrderNumber dell'elemento Order e l'elemento figlio OrderNo dell'elemento OrderDetail.
Nell'esempio, l'elemento figlio OrderNumber dell'elemento OrderDetail fa riferimento all'elemento chiave figlio OrderNo dell'elemento Order.
<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>
Il processo di mapping dello schema XSD (XML Schema Definition Language) consente di generare il seguente DataSet con due tabelle:
OrderDetail(OrderNo, ItemNo) and
Order(OrderNumber, EmpNumber)
Nel DataSet vengono inoltre definiti i seguenti vincoli:
Un vincolo univoco nella tabella Order.
Table: Order Columns: OrderNumber ConstraintName: OrderNumberKey Type: UniqueConstraint IsPrimaryKey: False
Una relazione tra le tabelle Order e OrderDetail. La proprietà Nested viene impostata su False, poiché i due elementi non sono annidati nello schema.
ParentTable: Order ParentColumns: OrderNumber ChildTable: OrderDetail ChildColumns: OrderNo ParentKeyConstraint: OrderNumberKey ChildKeyConstraint: OrderNoRef RelationName: OrderNoRef Nested: False
Un vincolo di chiave esterna nella tabella OrderDetail.
ConstraintName: OrderNoRef Type: ForeignKeyConstraint Table: OrderDetail Columns: OrderNo RelatedTable: Order RelatedColumns: OrderNumber