DataSet 中,可通过创建父子关系来形成两个或更多个列之间的关联。在 XML 架构定义语言 (XSD) 架构中,表示 DataSet 关系的方法有三种:

嵌套复杂类型

架构中的嵌套复杂类型定义指示元素的父子关系。以下 XML 架构片断显示 OrderDetailOrder 元素的子元素。

<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 批注的特性标识父子关系中所涉及的元素,以及该关系中所涉及的 parentkeychildkey 元素和特性。映射进程使用该信息在 DataSet 中生成表并在这些表之间创建主键/外键关系。

例如,以下架构片断指定位于同一级别(不嵌套)的 OrderOrderDetail 元素。该架构指定了一个 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 列和 DataSetOrderDetail 表中的 OrderNo 列之间创建父子关系。映射进程仅指定关系;与关系数据库中的主键/外键不同,它并不会自动对这些列中的值指定任何约束。您可以使用 XML 架构元素在“数据集”(DataSet) 中指定约束。

本节内容

映射嵌套架构元素之间的隐式关系
描述当在 XML 架构中遇到嵌套元素时在 DataSet 中隐式创建的约束和关系。
XML 架构定义语言 (XSD) 架构可以具有相互嵌套的复杂类型。在这种情况下,映射进程将应用默认映射并在 DataSet 中创建以下内容:
  • 为每个复杂类型(父和子)创建一个表。
  • 如果父表上不存在任何唯一约束,则每个表定义包含一个名为 TableName_Id 的附加主键列,其中 TableName 是父表的名称。
  • 在父表上创建主键约束,该约束将附加列标识为主键(通过将 IsPrimaryKey 属性设置为 True)。该约束以 Constraint# 的形式来命名,其中 # 为 1、2、3...。例如,第一个约束的默认名称为 Constraint1。
  • 在子表上创建外键约束,该约束将附加列标识为引用父表主键的外键。该约束以 ParentTable_ChildTable 的形式来命名,其中 ParentTable 为父表的名称,ChildTable 为子表的名称。
  • 在父表和子表之间创建数据关系。

以下示例显示一个架构,其中 OrderDetailOrder 的子元素。

<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 中创建以下内容:

  • OrderOrderDetail 表。

    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 表之间的关系。因为 OrderOrderDetail 元素在架构中嵌套,该关系的 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 中创建以下内容:

  • OrderOrderDetail 表。

    Order(OrderNumber, EmpNumber)
    OrderDetail(OrderNo, ItemNo)

  • Order 表和 OrderDetail 表之间的关系。因为 OrderOrderDetail 元素在架构中嵌套,该关系的 Nested 属性设置为 True

    ParentTable: Order
    ParentColumns: OrderNumber 
    ChildTable: OrderDetail
    ChildColumns: OrderNo 
    RelationName: OrdODRelation
    Nested: True

映射进程不创建任何约束。

指定不嵌套的元素之间的关系
描述如何在 DataSet 中创建不嵌套的 XML 架构元素之间的关系。
当元素不嵌套时,将不创建任何隐式关系。不过,可以使用 msdata:Relationship 批注来显式地指定不嵌套的元素之间的关系。

以下示例显示一个 XML 架构,其中在不嵌套的 OrderOrderDetail 元素之间指定了 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