DataRelation オブジェクトの概要
関連するデータ テーブルが含まれるデータセットは、DataRelation オブジェクトを使用してテーブル間の親子のリレーションシップを表し、相互に関連するレコードをやり取りします。 データ ソース構成ウィザードまたはデータセット デザイナーを使用して関連するテーブルをデータセットに追加すると、DataRelation オブジェクトが作成および構成されます。 関連するレコードを返す方法の詳細については、「方法 : 関連する DataTable のレコードにアクセスする」を参照してください。 データ リレーションシップの作成については、「方法 : データセット デザイナーで DataRelation を作成する」を参照してください。
DataRelation オブジェクトは次の 2 つの機能を実現します。
現在操作しているレコードに関連するレコードを利用できるようにします。 親レコードを操作している場合は子レコードが提供され (GetChildRows)、子レコードを操作している場合は親レコードが提供されます (GetParentRow)。
参照整合性に対する制約を適用します。たとえば、親レコードが削除されたときに、関連する子レコードを削除します。
真の結合と DataRelation オブジェクトの機能との違いを理解することが重要です。 真の結合では、親テーブルと子テーブルのレコードが 1 つのフラットなレコードセットに統合されます。 DataRelation オブジェクトを使用した場合、新しいレコードセットは作成されません。 その代わりに、テーブル間のリレーションシップが追跡され、親レコードと子レコードの間の同期が維持されます。
DataRelation オブジェクトと制約
DataRelation オブジェクトは、次の制約を作成して適用する場合にも使用できます。
テーブル内の列に重複するデータが含まれないことを保証する UNIQUE 制約
データセット内の親テーブルと子テーブルの間で参照整合性を維持するために使用できる外部キーの制約
DataRelation オブジェクトに指定する制約は、適切なオブジェクトを作成するかプロパティを設定することにより、自動的に実装されます。 DataRelation オブジェクトを使用して外部キー制約を作成する場合、ForeignKeyConstraint クラスのインスタンスが DataRelation の ChildKeyConstraint プロパティに追加されます。
単にデータ列の Unique プロパティを true に設定するか、または UniqueConstraint クラスのインスタンスを DataRelation オブジェクトの ParentKeyConstraint に追加すると、UNIQUE 制約が実装されます。 データセットの制約を中断する方法については、「方法 : データセットの読み込み中に制約をオフにする」を参照してください。
参照整合性規則
外部キーの制約の一部として、次の 3 つの時点で適用される参照整合性規則を指定できます。
親レコードが更新されたとき
親レコードが削除されたとき
変更が受け入れられたか拒否されたとき
作成できる規則は Rule 列挙値に指定されています。これを次の表に示します。
外部キーの制約の規則 |
動作 |
---|---|
親レコードに加えられた変更 (更新または削除) は、子テーブル内の関連するレコードにも加えられます。 |
|
子レコードは削除されませんが、子レコードの外部キーが DBNull に設定されます。 この設定により、子レコードを "孤立した" レコードのままにできます。つまり、親レコードに対するリレーションシップはありません。 注意 この規則を使用すると、子テーブルに無効なデータが残る場合があります。 |
|
関連する子レコードの外部キーは、列の DefaultValue プロパティで指定される既定の値に設定されます。 |
|
関連する子レコードは変更されません。 この設定では、子レコードに無効な親レコードへの参照が残る場合があります。 |
データセット テーブルの更新の詳細については、「データセットのデータの保存」を参照してください。
制約だけのリレーションシップ
DataRelation オブジェクトを作成する場合、制約を単に適用するためだけにリレーションシップが使用されることを明示するオプションを選択できます。したがって、関連するレコードへのアクセスには使用しないように指定できます。 このオプションは、関連レコード機能を使用する場合よりも、若干効率的で、少数のメソッドを含むデータセットを生成できます。 ただし、関連付けられているレコードにアクセスすることはできません。 たとえば、制約のみのリレーションシップを使用すると、まだ子レコードを持っている親レコードを削除できず、親レコードを介した子コードへのアクセスもできなくなります。