在 DataSet
中,可通过创建父子关系来形成两个或更多个列之间的关联。在
XML 架构定义语言 (XSD) 架构中,表示 DataSet
关系的方法有三种:
- 指定嵌套复杂类型。
- 使用 msdata:Relationship 批注。
- 指定不带 msdata:ConstraintOnly 批注的 xs:keyref。
嵌套复杂类型
架构中的嵌套复杂类型定义指示元素的父子关系。以下 XML
架构片断显示 OrderDetail 是 Order 元素的子元素。
<xs:element name="Order">
<xs:complexType>
<xs:sequence>
...
<xs:element name="OrderDetail" />
<xs:complexType>
...
</xs:complexType>
</xs:sequence>
</xs:complexType>
</xs:element>
XML 架构映射进程在 DataSet
中创建对应于架构中嵌套复杂类型的表。它还会另外创建一些列,以用作所生成的表的父子列。请注意,这些父子列指定关系,这与主键/外键约束不同。
msdata:Relationship 批注
msdata:Relationship
批注用于在不嵌套的架构中的元素之间显式指定父子关系。以下示例显示
Relationship 元素的结构。
<msdata:Relationship name="CustOrderRelationship"
msdata:parent="..."
msdata:child="..."
msdata:parentkey="..."
msdata:childkey="..." />
msdata:Relationship
批注的特性标识父子关系中所涉及的元素,以及该关系中所涉及的
parentkey 和 childkey
元素和特性。映射进程使用该信息在 DataSet
中生成表并在这些表之间创建主键/外键关系。
例如,以下架构片断指定位于同一级别(不嵌套)的 Order
和 OrderDetail 元素。该架构指定了一个 msdata:Relationship
批注,此批注指定这两个元素之间的父子关系。在这种情况下,必须使用
msdata:Relationship 批注来指定显式关系。
<xs:element name="MyDataSet" msdata:IsDataSet="true">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:element name="OrderDetail">
<xs:complexType>
...
</xs:complexType>
</xs:element>
<xs:element name="Order">
<xs:complexType>
...
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
<xs:annotation>
<xs:appinfo>
<msdata:Relationship name="OrdOrdDetailRelation"
msdata:parent="Order"
msdata:child="OrderDetail"
msdata:parentkey="OrderNumber"
msdata:childkey="OrderNo"/>
</xs:appinfo>
</xs:annotation>
映射进程使用 Relationship 元素在 Order 表中的 OrderNumber
列和 DataSet 的 OrderDetail 表中的 OrderNo
列之间创建父子关系。映射进程仅指定关系;与关系数据库中的主键/外键不同,它并不会自动对这些列中的值指定任何约束。您可以使用
XML 架构元素在“数据集”(DataSet) 中指定约束。
本节内容
- 映射嵌套架构元素之间的隐式关系
- 描述当在 XML 架构中遇到嵌套元素时在 DataSet
中隐式创建的约束和关系。
XML 架构定义语言 (XSD)
架构可以具有相互嵌套的复杂类型。在这种情况下,映射进程将应用默认映射并在
DataSet 中创建以下内容:
- 为每个复杂类型(父和子)创建一个表。
- 如果父表上不存在任何唯一约束,则每个表定义包含一个名为
TableName_Id 的附加主键列,其中 TableName
是父表的名称。
- 在父表上创建主键约束,该约束将附加列标识为主键(通过将
IsPrimaryKey 属性设置为 True)。该约束以
Constraint# 的形式来命名,其中 # 为 1、2、3...。例如,第一个约束的默认名称为
Constraint1。
- 在子表上创建外键约束,该约束将附加列标识为引用父表主键的外键。该约束以
ParentTable_ChildTable 的形式来命名,其中 ParentTable
为父表的名称,ChildTable 为子表的名称。
- 在父表和子表之间创建数据关系。
以下示例显示一个架构,其中 OrderDetail 是 Order
的子元素。
<xs:schema id="MyDataSet" xmlns=""
xmlns:xsd="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:string" />
<xs:element
name="EmpNumber" type="xs:string" />
<xs:element
name="OrderDetail">
<xs:complexType>
<xs:sequence>
<xs:element name="OrderNo" type="xs:string" />
<xs:element name="ItemNo" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
XML 架构映射进程在 DataSet 中创建以下内容:
- Order 和 OrderDetail 表。
Order(OrderNumber, EmpNumber, Order_Id)
OrderDetail(OrderNo, ItemNo, OrderId)
- Order 表上的唯一约束。请注意,IsPrimaryKey
属性设置为 True。
ConstraintName: Constraint1
Type: UniqueConstraint
Table: Order
Columns: Order_Id
IsPrimaryKey: True
- OrderDetail 表上的外键约束。
ConstraintName: Order_OrderDetail
Type: ForeignKeyConstraint
Table: OrderDetail
Columns: Order_Id
RelatedTable: Order
RelatedColumns: Order_Id
- Order 表和 OrderDetail 表之间的关系。因为
Order 和 OrderDetail
元素在架构中嵌套,该关系的 Nested
属性设置为 True。
ParentTable: Order
ParentColumns: Order_Id
ChildTable: OrderDetail
ChildColumns: Order_Id
ParentKeyConstraint: Constraint1
ChildKeyConstraint: Order_OrderDetail
RelationName: Order_OrderDetail
Nested: True
|
- 映射为嵌套元素指定的关系
- 描述如何在 DataSet 中为 XML
架构中的嵌套元素显式地设置关系。
| 架构可以包含 msdata:Relationship
批注,以显式地指定架构中任何两个元素之间的映射。在
msdata:Relationship
中指定的两个元素可以(但不必)嵌套在架构中。映射进程使用架构中的
msdata:Relationship 在两个列之间生成主键/外键关系。
以下示例显示一个 XML 架构,其中 OrderDetail
元素是 Order 的子元素。msdata:Relationship
标识此父子关系并指定所生成的 Order 表的 OrderNumber
列与所生成的 OrderDetail 表的 OrderNo 列相关。
<xs:schema id="MyDataSet" xmlns=""
xmlns:xsd="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:string" />
<xs:element name="EmpNumber"
type="xs:string" />
<xs:element name="OrderDetail">
<xs:annotation>
<xs:appinfo>
<msdata:Relationship
name="OrdODRelation"
msdata:parent="Order"
msdata:child="OrderDetail"
msdata:parentkey="OrderNumber"
msdata:childkey="OrderNo"/>
</xs:appinfo>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name="OrderNo" type="xs:string" />
<xs:element name="ItemNo" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
XML 架构映射进程在 DataSet 中创建以下内容:
- Order 和 OrderDetail 表。
Order(OrderNumber, EmpNumber)
OrderDetail(OrderNo, ItemNo)
- Order 表和 OrderDetail 表之间的关系。因为
Order 和 OrderDetail
元素在架构中嵌套,该关系的 Nested
属性设置为 True。
ParentTable: Order
ParentColumns: OrderNumber
ChildTable: OrderDetail
ChildColumns: OrderNo
RelationName: OrdODRelation
Nested: True
映射进程不创建任何约束。 |
- 指定不嵌套的元素之间的关系
- 描述如何在 DataSet 中创建不嵌套的 XML
架构元素之间的关系。
| 当元素不嵌套时,将不创建任何隐式关系。不过,可以使用
msdata:Relationship
批注来显式地指定不嵌套的元素之间的关系。
以下示例显示一个 XML 架构,其中在不嵌套的 Order
和 OrderDetail 元素之间指定了 msdata:Relationship
批注。msdata:Relationship 指定为 Schema
元素的子元素。
<xs:schema id="MyDataSet" xmlns=""
xmlns:xsd="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:string" />
<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:string" />
<xs:element
name="EmpNumber" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
<xs:annotation>
<xs:appinfo>
<msdata:Relationship name="OrdOrdDetailRelation"
msdata:parent="Order"
msdata:child="OrderDetail"
msdata:parentkey="OrderNumber"
msdata:childkey="OrderNo"/>
</xs:appinfo>
</xs:annotation>
</xs:schema>
XML 架构定义语言 (XSD) 架构映射进程创建一个 DataSet,它包含
Order 表和 OrderDetail
表以及在这两个之间指定的关系。
RelationName: OrdOrderDetailRelation
ParentTable: Order
ParentColumns: OrderNumber
ChildTable: OrderDetail
ChildColumns: OrderNo
Nested: False
|