keyref要素を使用すると、ドキュメント内の要素間のリンクを確立できます。 これは、リレーショナル データベースの外部キーリレーションシップに似ています。 スキーマで keyref 要素が指定されている場合、要素はスキーマ マッピング プロセス中に、 DataSetのテーブル内の列に対する対応する外部キー制約に変換されます。 既定では、 keyref 要素は、 ParentTable、 ChildTable、 ParentColumn、およびリレーションシップで指定された ChildColumn プロパティを使用して、リレーションシップも生成します。
次の表は、msdata要素で指定できるkeyref属性の概要を示しています。
| 属性名 | 説明 |
|---|---|
| msdata:ConstraintOnly | スキーマの要素keyref が指定されている場合、制約は作成されますが、リレーションシップは作成されません。 この属性が指定されていない (または False に設定されている) 場合は、制約とリレーションシップの両方が DataSet に作成されます。 |
| msdata:ConstraintName |
ConstraintName属性を指定すると、その値が制約の名前として使用されます。 それ以外の場合、スキーマのname要素のkeyref属性は、DataSet の制約名を提供します。 |
| msdata:UpdateRule | スキーマのUpdateRule要素でkeyref属性が指定されている場合、その値は UpdateRule の制約プロパティに割り当てられます。 それ以外の場合、 UpdateRule プロパティは Cascade に設定 されます。 |
| msdata:DeleteRule | スキーマのDeleteRule要素でkeyref属性が指定されている場合、その値は DeleteRule の制約プロパティに割り当てられます。 それ以外の場合、 DeleteRule プロパティは Cascade に設定 されます。 |
| msdata:AcceptRejectRule | スキーマのAcceptRejectRule要素でkeyref属性が指定されている場合、その値は AcceptRejectRule の制約プロパティに割り当てられます。 それ以外の場合、 AcceptRejectRule プロパティは None に設定されます。 |
次の例には、key要素のkeyref子要素とOrderNumber要素のOrder子要素の間のOrderNoとOrderDetailのリレーションシップを指定するスキーマが含まれています。
この例では、OrderNumber要素のOrderDetail子要素は、OrderNo要素のOrderキー子要素を参照しています。
<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 スキーマ定義言語 (XSD) スキーマ マッピング プロセスでは、2 つのテーブルを含む次の DataSet が生成されます。
OrderDetail(OrderNo, ItemNo) and
Order(OrderNumber, EmpNumber)
さらに、 DataSet は次の制約を定義します。
Orderテーブルの一意制約。Table: Order Columns: OrderNumber ConstraintName: OrderNumberKey Type: UniqueConstraint IsPrimaryKey: FalseOrderテーブルとOrderDetailテーブルの間のリレーションシップ。Nestedプロパティは、2 つの要素がスキーマに入れ子になっていないため、Falseに設定されます。ParentTable: Order ParentColumns: OrderNumber ChildTable: OrderDetail ChildColumns: OrderNo ParentKeyConstraint: OrderNumberKey ChildKeyConstraint: OrderNoRef RelationName: OrderNoRef Nested: FalseOrderDetailテーブルの外部キー制約。ConstraintName: OrderNoRef Type: ForeignKeyConstraint Table: OrderDetail Columns: OrderNo RelatedTable: Order RelatedColumns: OrderNumber