Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
In uno schema XSD (XML Schema Definition Language) è possibile specificare vincoli (vincoli univoci, chiave e keyref) e relazioni (usando l'annotazione msdata:Relationship ). In questo argomento viene illustrato come vengono interpretati i vincoli e le relazioni specificati in un XML Schema per generare l'oggetto DataSet.
In generale, in un XML Schema specificare l'annotazione msdata:Relationship se si desidera generare solo relazioni nel Set di dati. Per altre informazioni, vedere Generazione di relazioni dataset da XML Schema (XSD). È possibile specificare vincoli (univoci, chiave e keyref) se si desidera generare vincoli nel set di dati. Si noti che i vincoli chiave e keyref vengono usati anche per generare relazioni, come illustrato più avanti in questo argomento.
Generazione di una relazione da vincoli chiave e keyref
Anziché specificare l'annotazione msdata:Relationship , è possibile specificare vincoli key e keyref, che vengono utilizzati durante il processo di mapping di XML Schema per generare non solo i vincoli, ma anche la relazione nel DataSet. Tuttavia, se si specifica msdata:ConstraintOnly="true"
nell'elemento keyref , l'oggetto DataSet includerà solo i vincoli e non includerà la relazione.
Nell'esempio seguente viene illustrato un XML Schema che include elementi Order e OrderDetail , che non sono annidati. Lo schema specifica anche i vincoli di chiave e keyref.
<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 dataset generato durante il processo di mapping di XML Schema include le tabelle Order eOrderDetail . Inoltre, il set di dati include relazioni e vincoli. Nell'esempio seguente vengono illustrati questi vincoli e relazioni. Si noti che lo schema non specifica l'annotazione msdata:Relationship; invece, i vincoli key e keyref vengono utilizzati per generare la relazione.
....ConstraintName: OrderNumberKey
....Type: UniqueConstraint
....Table: Order
....Columns: OrderNumber
....IsPrimaryKey: False
....ConstraintName: OrderNoRef
....Type: ForeignKeyConstraint
....Table: OrderDetail
....Columns: OrderNo
....RelatedTable: Order
....RelatedColumns: OrderNumber
..RelationName: OrderNoRef
..ParentTable: Order
..ParentColumns: OrderNumber
..ChildTable: OrderDetail
..ChildColumns: OrderNo
..ParentKeyConstraint: OrderNumberKey
..ChildKeyConstraint: OrderNoRef
..Nested: False
Nell'esempio di schema precedente gli elementi Order e OrderDetail non sono annidati. Nell'esempio di schema seguente questi elementi sono annidati. Tuttavia, non viene specificata alcuna annotazione msdata:Relationship ; pertanto, si presuppone una relazione implicita. Per altre informazioni, vedere Eseguire il mapping di relazioni implicite tra elementi dello schema annidati. Lo schema specifica anche i vincoli di chiave e keyref.
<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="Order">
<xs:complexType>
<xs:sequence>
<xs:element name="OrderNumber" type="xs:integer" />
<xs:element name="EmpNumber" type="xs:integer" />
<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: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 set di dati risultante dal processo di mapping di XML Schema include due tabelle:
Order(OrderNumber, EmpNumber, Order_Id)
OrderDetail(OrderNumber, ItemNumber, Order_Id)
Il DataSet include anche le due relazioni (una basata sull'annotazione msdata:relationship e l'altra basata sui vincoli di chiave e keyref) e vari vincoli. Nell'esempio seguente vengono illustrate le relazioni e i vincoli.
..RelationName: Order_OrderDetail
..ParentTable: Order
..ParentColumns: Order_Id
..ChildTable: OrderDetail
..ChildColumns: Order_Id
..ParentKeyConstraint: Constraint1
..ChildKeyConstraint: Order_OrderDetail
..Nested: True
..RelationName: OrderNoRef
..ParentTable: Order
..ParentColumns: OrderNumber
..ChildTable: OrderDetail
..ChildColumns: OrderNo
..ParentKeyConstraint: OrderNumberKey
..ChildKeyConstraint: OrderNoRef
..Nested: False
..ConstraintName: OrderNumberKey
..Type: UniqueConstraint
..Table: Order
..Columns: OrderNumber
..IsPrimaryKey: False
..ConstraintName: Constraint1
..Type: UniqueConstraint
..Table: Order
..Columns: Order_Id
..IsPrimaryKey: True
..ConstraintName: Order_OrderDetail
..Type: ForeignKeyConstraint
..Table: OrderDetail
..Columns: Order_Id
..RelatedTable: Order
..RelatedColumns: Order_Id
..ConstraintName: OrderNoRef
..Type: ForeignKeyConstraint
..Table: OrderDetail
..Columns: OrderNo
..RelatedTable: Order
..RelatedColumns: OrderNumber
Se un vincolo keyref che fa riferimento a una tabella nidificata contiene l'annotazione msdata:IsNested="true", l'oggetto DataSet creerà una singola relazione nidificata basata sul vincolo keyref e sul vincolo unique/key correlato.