Condividi tramite


Mapping dei vincoli keyref dello schema XML (XSD) ai vincoli del 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. In base all'impostazione predefinita, una relazione viene generata anche dall'elemento keyref e le proprietà ParentTable, ChildTable, ParentColumn e ChildColumn vengono specificate per tale relazione.

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

Nome attributo Descrizione
msdata:ConstraintOnly Se ConstraintOnly="true" è specificato nell'elemento keyref dello schema, verrà creato un vincolo ma non verrà creata alcuna relazione. Se questo attributo non viene specificato (o è impostato su False), nel DataSet vengono creati sia il vincolo che la relazione.
msdata:ConstraintName Se l'attributo ConstraintName è specificato, il relativo valore viene utilizzato come nome del vincolo. In caso contrario il nome del vincolo nel DataSet viene fornito dall'attributo name dell'elemento keyref dello schema.
msdata:UpdateRule Se l'attributo UpdateRule viene specificato 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 l'attributo DeleteRule viene specificato 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 l'attributo AcceptRejectRule viene specificato 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 Cascade.

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 nell'elemento figlio OrderNumber dell'elemento OrderDetail è contenuto un riferimento all'elemento chiave figlio OrderNo dell'elemento Order.

<xs:schema id="MyDataSet"  
            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 produrre 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 nidificati 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 
    

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