Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Dans un schéma XSD (XML Schema Definition Language), vous pouvez spécifier des contraintes (contraintes uniques, clés et keyref) et des relations (à l’aide de l’annotation msdata :Relationship ). Cette rubrique explique comment les contraintes et les relations spécifiées dans un schéma XML sont interprétées pour générer le DataSet.
En général, dans un schéma XML, vous spécifiez l’annotation msdata :Relationship si vous souhaitez générer uniquement des relations dans le DataSet. Pour plus d’informations, consultez Génération de relations dataSet à partir du schéma XML (XSD). Vous spécifiez des contraintes (uniques, clés et keyref) si vous souhaitez générer des contraintes dans dataSet. Notez que les contraintes clé et keyref sont également utilisées pour générer des relations, comme expliqué plus loin dans cette rubrique.
Génération d'une relation à partir des contraintes key et keyref
Au lieu de spécifier l’annotation msdata :Relationship , vous pouvez spécifier des contraintes clé et keyref, qui sont utilisées pendant le processus de mappage de schéma XML pour générer non seulement les contraintes, mais également la relation dans le DataSet. Toutefois, si vous spécifiez msdata:ConstraintOnly="true" dans l’élément keyref , il DataSet inclut uniquement les contraintes et n’inclut pas la relation.
L’exemple suivant montre un schéma XML qui inclut les éléments Order et OrderDetail, lesquels ne sont pas imbriqués. Le schéma spécifie également des contraintes key et 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>
Le DataSet généré lors du processus de mappage du schéma XML inclut les tables Order et OrderDetail. En outre, le DataSet inclut les relations et les contraintes. L’exemple suivant montre ces relations et ces contraintes. Notez que le schéma ne spécifie pas l’annotation msdata :Relationship ; Au lieu de cela, les contraintes clé et keyref sont utilisées pour générer la relation.
....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
Dans l’exemple de schéma précédent, les éléments Order et OrderDetail ne sont pas imbriqués. Dans l’exemple de schéma suivant, ces éléments sont imbriqués. Toutefois, aucune annotation msdata :Relationship n’est spécifiée ; par conséquent, une relation implicite est supposée. Pour plus d’informations, consultez Mapper les relations implicites entre les éléments de schéma imbriqués. Le schéma spécifie également des contraintes key et 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>
Le DataSet résultat du processus de mappage de schéma XML comprend deux tables :
Order(OrderNumber, EmpNumber, Order_Id)
OrderDetail(OrderNumber, ItemNumber, Order_Id)
Il DataSet comprend également les deux relations (l'une basée sur l'annotation msdata :relationship et l'autre sur la clé et les contraintes de type keyref) et diverses contraintes. L’exemple suivant montre les relations et les contraintes.
..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
Si une contrainte keyref faisant référence à une table imbriquée contient l’annotation msdata :IsNested="true » , elle DataSet crée une relation imbriquée unique basée sur la contrainte keyref et la contrainte unique/clé associée.