Relacje i ograniczenia schematu XML
W schemacie języka definicji schematu XML (XSD) można określić ograniczenia (ograniczenia unikatowe, klucz i keyref) i relacje (przy użyciu adnotacji msdata:Relationship ). W tym temacie wyjaśniono, jak ograniczenia i relacje określone w schemacie XML są interpretowane w celu wygenerowania elementu DataSet.
Ogólnie rzecz biorąc, w schemacie XML należy określić adnotację msdata:Relationship , jeśli chcesz wygenerować tylko relacje w zestawie danych. Aby uzyskać więcej informacji, zobacz Generowanie relacji zestawu danych na podstawie schematu XML (XSD). Należy określić ograniczenia (unikatowe, klucz i keyref), jeśli chcesz wygenerować ograniczenia w zestawie danych. Należy pamiętać, że ograniczenia klucza i klucza są również używane do generowania relacji, jak wyjaśniono w dalszej części tego tematu.
Generowanie relacji na podstawie ograniczeń klucza i klucza
Zamiast określać adnotację msdata:Relationship , można określić ograniczenia klucza i klucza, które są używane podczas procesu mapowania schematu XML w celu wygenerowania nie tylko ograniczeń, ale także relacji w zestawie danych. Jeśli jednak określisz msdata:ConstraintOnly="true"
element keyref , zestaw danych będzie zawierać tylko ograniczenia i nie będzie zawierać relacji.
W poniższym przykładzie przedstawiono schemat XML zawierający elementy Order i OrderDetail , które nie są zagnieżdżone. Schemat określa również ograniczenia klucza i klucza.
<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>
Zestaw danych generowany podczas procesu mapowania schematu XML obejmuje tabele Order i OrderDetail . Ponadto zestaw DataSet zawiera relacje i ograniczenia. W poniższym przykładzie przedstawiono te relacje i ograniczenia. Należy pamiętać, że schemat nie określa adnotacji msdata:Relationship ; zamiast tego ograniczenia klucza i keyref są używane do generowania relacji.
....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
W poprzednim przykładzie schematu elementy Order i OrderDetail nie są zagnieżdżone. W poniższym przykładzie schematu te elementy są zagnieżdżone. Nie określono jednak adnotacji msdata:Relationship; w związku z tym przyjmuje się, że przyjmuje się niejawną relację. Aby uzyskać więcej informacji, zobacz Mapuj niejawne relacje między zagnieżdżonym elementami schematu. Schemat określa również ograniczenia klucza i klucza.
<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>
Zestaw danych wynikający z procesu mapowania schematu XML zawiera dwie tabele:
Order(OrderNumber, EmpNumber, Order_Id)
OrderDetail(OrderNumber, ItemNumber, Order_Id)
Zestaw danych zawiera również dwie relacje (jedną opartą na adnotacji msdata:relationship , a drugą na podstawie ograniczeń klucza i keyref) oraz różne ograniczenia. W poniższym przykładzie przedstawiono relacje i ograniczenia.
..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
Jeśli ograniczenie keyref odwołujące się do zagnieżdżonej tabeli zawiera adnotację msdata:IsNested="true" , zestaw Danych utworzy pojedynczą relację zagnieżdżoną opartą na ograniczeniu keyref i powiązanym ograniczeniu unikatowy/klucz.