次の方法で共有


XML スキーマの制約とリレーションシップ

XML スキーマ定義言語 (XSD) スキーマでは、制約 (一意、キー、およびキー参照の制約) とリレーションシップ ( msdata:Relationship 注釈を使用) を指定できます。 このトピックでは、XML スキーマで指定された制約とリレーションシップを解釈して DataSetを生成する方法について説明します。

一般に、XML スキーマでは、DataSet でリレーションシップのみを生成する場合は、msdata:Relationship 注釈を指定します。 詳細については、「 XML スキーマ (XSD) からの DataSet リレーションの生成」を参照してください。 DataSet で制約を生成する場合は、制約 (一意、キー、および keyref) を指定します。 このトピックで後述するように、キー制約と keyref 制約はリレーションシップの生成にも使用されることに注意してください。

キー制約と keyref 制約からのリレーションシップの生成

msdata:Relationship 注釈を指定する代わりに、キー制約と keyref 制約を指定できます。この制約は、XML スキーマ マッピング プロセス中に使用され、制約だけでなく、DataSet 内のリレーションシップも生成されます。 ただし、msdata:ConstraintOnly="true"要素でkeyrefを指定した場合、DataSetには制約のみが含まれるので、リレーションシップは含まれません。

次の例は、入れ子になっていない Order 要素と OrderDetail 要素を含む XML スキーマを示しています。 スキーマでは、キー制約と 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 スキーマ マッピング プロセス中に生成される DataSet には、 Order テーブルと OrderDetail テーブルが含まれます。 さらに、 DataSet にはリレーションシップと制約が含まれています。 次の例は、これらのリレーションシップと制約を示しています。 スキーマで msdata:Relationship 注釈が指定されていないことに注意してください。代わりに、キー制約と 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 注釈は指定されません。したがって、暗黙的な関係が想定されます。 詳細については、「 入れ子になったスキーマ要素間の暗黙的な関係をマップする」を参照してください。 スキーマでは、キー制約と 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 スキーマ マッピング プロセスの結果として得られる DataSet には、次の 2 つのテーブルが含まれます。

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

DataSetには、2 つのリレーションシップ (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" 注釈が含まれている場合、 DataSet は keyref 制約と関連する一意/キー制約に基づく単一の入れ子になったリレーションシップを作成します。

こちらも参照ください