Поделиться через


Ограничения и связи схемы XML (ADO.NET)

Обновлен: November 2007

В схеме XSD можно указать ограничения (ограничения unique, key и keyref) и связи (с использованием заметки msdata:Relationship). В этом разделе описана интерпретация ограничений и связей, указанных в схеме XML, при формировании набора данных DataSet.

Как правило, в схеме XML указывается заметка msdata:Relationship, если нужно создать только связи в DataSet. Дополнительные сведения см. в разделе Формирование связей DataSet на основе схемы XML (XSD). Необходимо указать ограничения (unique, key и keyref), если нужно создать ограничения в наборе данных DataSet. Обратите внимание, что ограничения key и keyref используются также для формирования связей, как объясняется далее в подразделе.

Формирование связи из ограничений key и keyref

Чтобы сформировать не только ограничения, но и связи в наборе DataSet, можно вместо заметки msdata:Relationship указать ограничения key и keyref, которые используются в процессе сопоставления схемы XML. Однако, если указать msdata:ConstraintOnly="true" в элементе keyref, то в набор 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>

Набор DataSet, создаваемый в процессе сопоставления схемы XML, содержит таблицы 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 не указана, поэтому подразумевается неявная связь. Дополнительные сведения см. в разделе Сопоставление неявных связей между вложенными элементами схемы (ADO.NET). Схема также указывает ограничения 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>

Набор DataSet, полученный в процессе сопоставления схемы XML, содержит две таблицы:

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.

См. также

Другие ресурсы

Выведение реляционной структуры DataSet из схемы XML (XSD)