在 XML 架構定義語言 (XSD) 架構中,您可以指定條件約束(唯一、索引鍵和 keyref 條件約束)和關聯性(使用 msdata:Relationship 註釋)。 本主題說明如何解譯 XML 架構中指定的條件約束和關聯性,以產生 DataSet。
一般而言,在 XML 架構中,如果您想要只在 DataSet 中產生關聯性,您可以指定 msdata:Relationship 批注。 如需詳細資訊,請參閱從 XML 架構產生 DataSet 關聯性 (XSD)。 如果您想要在 DataSet 中產生條件約束,請指定條件約束(唯一、索引鍵和 keyref)。 請注意,索引鍵和keyref條件約束也可用來產生關聯性,如本主題稍後所述。
從索引鍵和keyref條件約束產生關聯性
您可以指定鍵和keyref約束條件,而不是指定msdata:Relationship註釋。在 XML 模式映射過程中,這些約束條件不僅用於產生約束,還用於在DataSet中產生關係。 然而,如果你在元素中msdata:ConstraintOnly="true"指定keyref,則DataSet只會包含約束,且不會包含關係。
以下範例展示了包含 Order 和 OrderDetail 元素的 XML 架構,這些元素並非巢狀結構。 架構也會指定索引鍵和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>
在 XML Schema 映射過程中生成的DataSet包含Order和OrderDetail表格。 此外,還 DataSet 包含關係與限制條件。 下列範例顯示這些關聯性和條件約束。 請注意,架構未指定 msdata:Relationship 註釋;而是使用索引鍵和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 註釋;因此,會假設隱含關聯性。 如需詳細資訊,請參閱 巢狀架構元素之間的隱含關聯映射。 架構也會指定索引鍵和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>
DataSet XML 結構映射過程的結果包含兩個表格:
Order(OrderNumber, EmpNumber, Order_Id)
OrderDetail(OrderNumber, ItemNumber, Order_Id)
同時 DataSet 也包含兩個關係(一個基於 msdata:relationship 註解,另一個基於鍵與 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 約束及相關唯一/鍵限制的單一巢狀關係。
另請參閱
- 從 XML 架構衍生 DataSet 關係結構 (XSD)
- ADO.NET 概觀