XML 架构定义语言 (XSD) 允许对它所定义的元素和特性指定约束。在将 XML 架构映射到 DataSet 中的关系架构时,XML 架构约束将映射到 DataSet 中表和列上的相应关系约束。

本主题讨论以下 XML 架构约束的映射:

使用对元素或特性的约束,可以对任何文档实例中元素的值指定特定的约束。例如,对架构中 Customer 元素的 CustomerID 子元素的某一键约束指示 CustomerID 子元素的值必须在任何文档实例中都是唯一的,并且不允许空值。

为了在文档中建立关系,也可以在文档中的元素和特性之间指定约束。keykeyref 约束用于在架构中指定文档中的约束,从而生成文档元素和特性之间的关系。

映射进程将这些架构约束转换为在 DataSet 中创建的表上的相应约束。

本节内容

将唯一 XML 架构 (XSD) 约束映射到 DataSet 约束:描述用于在 DataSet 中创建唯一约束的 XML 架构元素。

在 XML 架构定义语言 (XSD) 架构中,unique 元素对元素或特性指定唯一约束。在将 XML 架构转换为关系架构 (DataSet) 的过程中,对 XML 架构中的元素或特性指定的唯一约束将映射到所生成的相应 DataSet 中的 DataTable 中的唯一约束。

下表概括了可在 unique 元素中指定的 msdata 特性。

特性名 说明
msdata:ConstraintName 如果指定了该特性,它的值将用作约束名。否则,name 特性会提供约束名的值。
msdata:PrimaryKey 如果 PrimaryKey="true" 出现在 unique 元素中,则在将 IsPrimaryKey 属性设置为 true 的情况下创建唯一约束。

以下示例显示一个 XML 架构,它使用 unique 元素来指定唯一约束。

<xs:schema id="SampleDataSet" 
            xmlns="" 
            xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
            xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
  <xs:element name="Customers">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="CustomerID" type="xs:integer" minOccurs="0" />
        <xs:element name="CompanyName" type="xs:string" minOccurs="0" />
       <xs:element name="Phone" type="xs:string" />
     </xs:sequence>
   </xs:complexType>
 </xs:element>

 <xs:element name="SampleDataSet" msdata:IsDataSet="true">
  <xs:complexType>
    <xs:choice maxOccurs="unbounded">
      <xs:element ref="Customers" />
    </xs:choice>
  </xs:complexType>
<xs:unique
msdata:ConstraintName="UCustID"
name="UniqueCustIDConstr" >
<xs:selector xpath=".//Customers" />
<xs:field xpath="CustomerID" />
</xs:unique>
 </xs:element>
</xs:schema>

该架构中的 unique 元素指定对于文档实例中的所有 Customers 元素,CustomerID 子元素的值必须是唯一的。当生成 DataSet 时,映射进程将读取此架构并生成下表:

Customers (CustomerID, CompanyName, Phone)

映射进程还会在 CustomerID 列上创建一个唯一约束,如以下 DataSet 所示。(为简便起见,只显示相关属性。)

DataSetName: MyDataSet
TableName: Customers
  ColumnName: CustomerID
      AllowDBNull: True
      Unique: True
  ConstraintName: UcustID
      Type: UniqueConstraint
      Table: Customers
      Columns: CustomerID 
      IsPrimaryKey: False

在所生成的 DataSet 中,对于唯一约束,IsPrimaryKey 属性设置为 False。该列上的 unique 属性指示 CustomerID 列值必须是唯一的(但它们可以是空引用,这是该列的 AllowDBNull 属性所指定的)。

如果修改架构,指定 unique 元素的可选 msdata:PrimaryKey 特性并将它的值设置为 True,则将在表上创建唯一约束。AllowDBNull 列属性设置为 False,而约束的 IsPrimaryKey 属性设置为 True,从而使 CustomerID 列成为主键列。

您可以对 XML 架构中元素或特性的组合指定唯一约束。以下示例演示如何通过在架构中添加另一个 xs:field 元素来指定 CustomerID 和 CompanyName 值的组合必须对于任何实例中的所有 Customers 都是唯一的。

   <xs:unique  
            msdata:ConstraintName="SomeName" 
            name="UniqueCustIDConstr" >
     <xs:selector xpath=".//Customers" />
     <xs:field xpath="CustomerID" />
     <xs:field xpath="CompanyName" />
   </xs:unique>

以下示例显示在所生成的 DataSet 中创建的约束。

ConstraintName: SomeName
  Table: Customers
Columns: CustomerID CompanyName
  IsPrimaryKey: False

将键 XML 架构 (XSD) 约束映射到 DataSet 约束:描述用于在 DataSet 中创建键约束(不允许 null 值的唯一约束)的 XML 架构元素。

在架构中可以使用 key 元素对元素或特性指定键约束。对其指定键约束的元素或特性必须在任何架构实例中都具有唯一值,并且不能具有空值。

除了对其定义键约束的列不能具有空值之外,键约束与唯一约束类似。

下表概括了可在 key 元素中指定的 msdata 特性。

特性名 说明
msdata:ConstraintName 如果指定了该特性,它的值将用作约束名。否则,name 特性会提供约束名的值。
msdata:PrimaryKey 如果存在 PrimaryKey="true"IsPrimaryKey 约束属性将设置为 True,从而使其成为主键。由于主键不能具有空值,所以 AllowDBNull 列属性将设置为 False

当转换在其中指定键约束的架构时,映射进程会在为约束中的每一列将 AllowDBNull 列属性设置为 False 情况下在表上创建唯一约束。除非对 key 元素指定 msdata:PrimaryKey="true",否则唯一约束的 IsPrimaryKey 属性也将设置为 False。它与其中 PrimaryKey="true" 的架构中的唯一约束相同。

在以下架构示例中,key 元素对 CustomerID 元素指定键约束。

<xs:schema id="cod"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
            xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
  <xs:element name="Customers">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="CustomerID" type="xs:string" minOccurs="0" />
        <xs:element name="CompanyName" type="xs:string" minOccurs="0" />
       <xs:element name="Phone" type="xs:string" />
     </xs:sequence>
   </xs:complexType>
 </xs:element>

 <xs:element name="MyDataSet" msdata:IsDataSet="true">
  <xs:complexType>
    <xs:choice maxOccurs="unbounded">
      <xs:element ref="Customers" />
    </xs:choice>
  </xs:complexType>
<xs:key msdata:PrimaryKey="true"
msdata:ConstraintName="KeyCustID"
name="KeyConstCustomerID" >
<xs:selector xpath=".//Customers" />
<xs:field xpath="CustomerID" />
</xs:key>
 </xs:element>
</xs:schema>

key 元素指定 Customers 元素的 CustomerID 子元素的值必须是唯一值,并且不能具有空值。在转换 XML 架构定义语言 (XSD) 架构时,映射进程将创建下表:

Customers(CustomerID, CompanyName, Phone)

XML 架构映射还会在 CustomerID 列上创建 UniqueConstraint,如以下 DataSet 所示。(为简便起见,只显示相关属性。)

DataSetName: MyDataSet
TableName: customers
  ColumnName: CustomerID
      AllowDBNull: False
      Unique: True
  ConstraintName: KeyCustID
      Table: customers
      Columns: CustomerID 
      IsPrimaryKey: True

在所生成的 DataSet 中,由于该架构在 key 元素中指定 msdata:PrimaryKey="true",所以 UniqueConstraintIsPrimaryKey 属性将设置为 True

DataSetUniqueConstraintConstraintName 属性值是在该架构的 key 元素中指定的 msdata:ConstraintName 特性值。

将 keyref XML 架构 (XSD) 约束映射到 DataSet 约束:描述用于在 DataSet 中创建 keyref(外键)约束的 XML 架构元素。

keyref 元素用于在文档中的元素之间建立链接。它类似于关系数据库中的外键关系。如果架构指定 keyref 元素,则在架构映射进程中,该元素将转换为 DataSet 的表列上的相应外键约束。默认情况下,keyref 元素还会生成关系,并对关系指定 ParentTableChildTableParentColumnChildColumn 属性。

下表概括了可在 keyref 元素中指定的 msdata 特性。

特性名 说明
msdata:ConstraintOnly 如果对架构中的 keyref 元素指定 ConstraintOnly="true",则将创建约束但不创建任何关系。如果此特性尚未指定(或设置为 False),则将在 DataSet 中创建约束和关系。
msdata:ConstraintName 如果指定 ConstraintName 特性,则将其值用作约束的名称。否则,架构中 keyref 元素的 name 特性将提供 DataSet 中的约束名称。
msdata:UpdateRule 如果在架构的 keyref 元素中指定 UpdateRule 特性,则将其值赋给 DataSet 中的 UpdateRule 约束属性。否则,UpdateRule 属性将设置为 Cascade
msdata:DeleteRule 如果在架构的 keyref 元素中指定 DeleteRule 特性,则将其值赋给 DataSet 中的 DeleteRule 约束属性。否则,DeleteRule 属性将设置为 Cascade
msdata:AcceptRejectRule 如果在架构的 keyref 元素中指定 AcceptRejectRule 特性,则将其值赋给 DataSet 中的 AcceptRejectRule 约束属性。否则,AcceptRejectRule 属性将设置为 None

以下示例包含一个架构,它在 Order 元素的 OrderNumber 子元素和 OrderDetail 元素的 OrderNo 子元素之间指定 keykeyref 关系。

在该示例中,OrderDetail 元素的 OrderNumber 子元素引用 Order 元素的 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="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 架构定义语言 (XSD) 架构映射进程生成以下包含两个表的 DataSet

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

此外,该 DataSet 还定义以下约束:

  • Order 表上的唯一约束。

    Table: Order
    Columns: OrderNumber
    ConstraintName: OrderNumberKey
    Type: UniqueConstraint
    IsPrimaryKey: False

  • Order 表和 OrderDetail 表之间的关系。由于这两个元素都不嵌套在架构中,所以 Nested 属性设置为 False

    ParentTable: Order
    ParentColumns: OrderNumber 
    ChildTable: OrderDetail
    ChildColumns: OrderNo 
    ParentKeyConstraint: OrderNumberKey
    ChildKeyConstraint: OrderNoRef
    RelationName: OrderNoRef
    Nested: False

  • OrderDetail 表上的外键约束。

    ConstraintName: OrderNoRef
    Type: ForeignKeyConstraint
    Table: OrderDetail
    Columns: OrderNo
    RelatedTable: Order
    RelatedColumns: OrderNumber