瞭解條件約束和關聯性間的交互關係
您可以在 XML 結構描述定義語言 (XSD) 結構描述中指定條件約束 (unique 條件約束、key 條件約束和 keyref 條件約束) 以及關聯性 (使用 msdata:Relationship 註釋)。這個主題解說 XML 結構描述內指定的條件約束和關聯性如何經過解譯以產生 DataSet。
一般而言,如果您想在 DataSet 內只產生關聯性,則可以在 XML 結構描述內指定 msdata:Relationship 註釋。如需詳細資訊,請參閱從 XML 結構描述 (XSD) 產生 DataSet 關聯。如果您要在 DataSet 內產生條件約束,則需要指定條件約束 (unique 條件約束、key 條件約束和 keyref 條件約束)。請注意,key 條件約束和 keyref 條件約束也用於產生關聯性,詳情請見這個主題的後續說明。
從 key 條件約束和 keyref 條件約束產生關聯性
除了指定 msdata:Relationship 註釋,您也可以指定 key 條件約束和 keyref 條件約束,在 XML 結構描述對應處理序期間,於 DataSet 內產生條件約束和關聯性。但是,如果在 keyref 項目中指定 msdata:ConstraintOnly="true"
,DataSet 將只包含條件約束,而不包含關聯性。
下列範例所顯示的 XML 結構描述包含無巢狀的 Order 和 OrderDetail 項目,結構描述也指定 key 和 keyref 條件約束。
<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>
XML 結構描述對應處理序期間產生的 DataSet 包含 Order 和 OrderDetail 資料表;此外,DataSet 也包含關聯性和條件約束。下列範例即顯示這些關聯性和條件約束。請注意,結構描述未指定 msdata:Relationship 註釋,而是使用 key 條件約束和 keyref 條件約束來產生關聯。
....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
上一個結構描述範例中,Order 和 OrderDetail 項目無巢狀化。下列的結構描述範例中,這些項目則為巢狀化。不過這個範例中沒有指定 msdata:Relationship 註釋,所以我們假設這些項目具有隱含關聯。如需詳細資訊,請參閱對應巢狀結構描述項目間的隱含關聯。結構描述也指定 key 和 keyref 條件約束。
<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="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>
從 XML 結構描述對應處理序產生的 DataSet 包括兩個資料表:
Order(OrderNumber, EmpNumber, Order_Id) OrderDetail(OrderNumber, ItemNumber, Order_Id)
DataSet 也包含兩個關聯性 (一個以 msdata:relationship 註釋為基礎,另一個採用 key 條件約束和 keyref 條件約束) 和數個條件約束。下列範例顯示關聯和條件約束。
..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
如果 keyref 條件約束參考的巢狀資料表包含 msdata:IsNested="true" 註釋,則 DataSet 會以 keyref 條件約束和關聯 unique/key 條件約束,建立單一巢狀關聯性。