Ограничения и отношения схемы XML

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

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

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

Вместо указания заметки msdata:Relationship можно указать ограничения key и keyref, которые используются во время процесса сопоставления схемы XML для создания не только ограничений, но и связей в Наборе данных. Однако при указании msdata:ConstraintOnly="true" в элементе keyref набор данных будет включать только ограничения и не будет включать связь.

В следующем примере показана XML-схема, содержащая элементы Order и OrderDetail , которые не вложены. Схема также указывает ограничения key и 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, включает таблицы Order и OrderDetail. Кроме того, набор данных включает связи и ограничения. Эти связи и ограничения показаны в приведенном ниже примере. Обратите внимание, что схема не указывает заметку 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 не указана, поэтому предполагается неявное отношение. Дополнительные сведения см. в разделе "Сопоставление неявных отношений между вложенными элементами схемы". Схема также указывает ограничения key и 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>  

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

Order(OrderNumber, EmpNumber, Order_Id)  
OrderDetail(OrderNumber, ItemNumber, Order_Id)  

Набор данных также включает две связи (один из них основан на заметке 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", набор данных создаст одну вложенную связь, основанную на ограничении keyref и связанном ограничении unique/key.

См. также