次の方法で共有


.NET Framework アプリケーションでデータセット間のリレーションシップを作成する

DataSet クラスと関連クラスは、アプリケーションがデータベースから切断されている間にアプリケーションがメモリ内のデータを操作できるようにする、2000 年代初頭のレガシ .NET Framework テクノロジです。 このテクノロジは、ユーザーがデータを変更し、変更をデータベースに保持できるアプリに特に役立ちます。 データセットは実証済みの成功したテクノロジですが、新しい .NET アプリケーションには Entity Framework Core を使用することをお勧めします。 Entity Framework は、オブジェクト モデルとして表形式データを操作するより自然な方法を提供し、よりシンプルなプログラミング インターフェイスを備えています。

関連するデータ テーブルを含むデータセットでは、 DataRelation オブジェクトを使用してテーブル間の親子関係を表し、相互に関連するレコードを返します。 データ ソース構成ウィザードまたはデータセット デザイナーを使用して関連テーブルをデータセットに追加すると、DataRelation オブジェクトが自動的に作成および構成されます。

DataRelation オブジェクトは、次の 2 つの関数を実行します。

  • 操作中のレコードに関連するレコードを閲覧できるようになります。 ユーザーが親レコードを使用している場合は子レコードが提供され (GetChildRows)、子レコードを使用している場合は親レコードが提供されます (GetParentRow)。

  • 親レコードを削除するときに関連する子レコードを削除するなど、参照整合性の制約を適用できます。

真の結合と DataRelation オブジェクトの関数の違いを理解することが重要です。 true 結合では、レコードは親テーブルと子テーブルから取得され、単一のフラット レコードセットに格納されます。 DataRelation オブジェクトを使用する場合、新しいレコードセットは作成されません。 代わりに、DataRelation はテーブル間のリレーションシップを追跡し、親レコードと子レコードの同期を維持します。

DataRelation オブジェクトと制約

DataRelation オブジェクトは、次の制約を作成して適用するためにも使用されます。

  • テーブル内の列に重複が含まれないことを保証する一意の制約。

  • 外部キー制約。データセット内の親テーブルと子テーブル間の参照整合性を維持するために使用できます。

DataRelation オブジェクトで指定した制約は、適切なオブジェクトを自動的に作成するか、プロパティを設定することによって実装されます。 DataRelation オブジェクトを使用して外部キー制約を作成すると、ForeignKeyConstraint クラスのインスタンスがDataRelation オブジェクトのChildKeyConstraint プロパティに追加されます。

一意制約は、データ列の Unique プロパティを true に設定するか、 UniqueConstraint クラスのインスタンスを DataRelation オブジェクトの ParentKeyConstraint プロパティに追加することによって実装されます。 データセット内の制約を中断する方法については、「データセットの 入力中に制約を無効にする」を参照してください。

参照整合性の規則

外部キー制約の一部として、次の 3 つのポイントで適用される参照整合性規則を指定できます。

  • 親レコードが更新されたとき

  • 親レコードが削除されたとき

  • 変更が承認または拒否された場合

作成できる規則は、 Rule 列挙体で指定され、次の表に示されています。

外部キー制約規則 アクション
Cascade 親レコードに対する変更 (更新または削除) は、子テーブルの関連レコードでも行われます。
SetNull 子レコードは削除されませんが、子レコードの外部キーは DBNullに設定されます。 この設定では、子レコードを "孤立" として残すことができます。つまり、親レコードとは関係がありません。 手記: このルールを使用すると、子テーブルのデータが無効になることがあります。
SetDefault 関連する子レコードの外部キーは、(列の DefaultValue プロパティによって確立される) 既定値に設定されます。
None 関連する子レコードは変更されません。 この設定では、子レコードに無効な親レコードへの参照を含めることができます。

データセット テーブルの更新の詳細については、「データを データベースに保存する」を参照してください。

制約のみのリレーションシップ

DataRelation オブジェクトを作成する場合は、リレーションシップを制約の適用にのみ使用するように指定できます。つまり、関連レコードへのアクセスにも使用されません。 このオプションを使用すると、少し効率的で、関連レコード機能を持つメソッドよりも少ないメソッドを含むデータセットを生成できます。 ただし、関連レコードにはアクセスできません。 たとえば、制約のみのリレーションシップを使用すると、子レコードを持つ親レコードを削除できなくなり、親を介して子レコードにアクセスすることはできません。

データセット デザイナーでデータ リレーションシップを手動で作成する

Visual Studio のデータ デザイン ツールを使用してデータ テーブルを作成すると、データのソースから情報を収集できる場合、リレーションシップが自動的に作成されます。 ツールボックスの [データセット] タブからデータ テーブルを手動で追加する場合は、リレーションシップを手動で作成する必要がある場合があります。 DataRelation オブジェクトをプログラムで作成する方法については、「DataRelations の追加」を参照してください。

データ テーブル間のリレーションシップは、リレーションシップの一対多の側面を表すキーと無限のグリフを持つ行として データセット デザイナーに表示されます。 既定では、リレーションシップの名前はデザイン サーフェイスには表示されません。

この記事の手順では、Visual Studio で使用できる対話型開発エクスペリエンス (IDE) の最新バージョンについて説明します。 コンピューターには、一部のユーザー インターフェイス要素に対して異なる名前または場所が表示される場合があります。 別のバージョンの Visual Studio または異なる環境設定を使用している可能性があります。 詳細については、「IDEのカスタマイズ」を参照してください。

2 つのデータ テーブル間にリレーションシップを作成するには

  1. データセット デザイナーでデータセットを開きます。 詳細については、「 チュートリアル: データセット デザイナーでのデータセットの作成」を参照してください。

  2. DataSet ツールボックスからリレーションシップ内の子データ テーブルに Relation オブジェクトをドラッグします。

    [ リレーション ]ダイアログ ボックスが開き、[ 子テーブル ]ボックスに 、Relation オブジェクトをドラッグしたテーブルが設定されます。

  3. [親テーブル] ボックスから 親テーブル を選択します。 親テーブルには、一対多リレーションシップの "一" 側のレコードが含まれています。

  4. [子テーブル] ボックスに正しい 子テーブル が表示されていることを確認します。 子テーブルには、一対多リレーションシップの "多" 側のレコードが含まれます。

  5. [ 名前] ボックス にリレーションシップの名前を入力するか、選択したテーブルに基づいて既定の名前のままにします。 これは、コード内の実際の DataRelation オブジェクトの名前です。

  6. キー列リストと外部キー列リストでテーブルを結合する列を選択します。

  7. リレーション、拘束、またはその両方を作成するかどうかを選択します。

  8. [入れ子になった関係] ボックスをオンまたはオフにします。 このオプションを音にすると、Nested プロパティが true に設定され、それらの行が XML データとして書き込まれるとき、または XmlDataDocument と同期されるときに、リレーションシップの子の行が親の列に入れ子にされます。 詳しくは、「DataRelation の入れ子化」をご覧ください。

  9. これらのテーブル内のレコードに変更を加えるときに適用される規則を設定します。 詳細については、Ruleを参照してください。

  10. [ OK] を クリックしてリレーションシップを作成します。 2 つのテーブル間の関係線がデザイナーに表示されます。

データセット デザイナーでリレーションシップ名を表示するには

  1. データセット デザイナーでデータセットを開きます。 詳細については、「 チュートリアル: データセット デザイナーでのデータセットの作成」を参照してください。

  2. [ データ ]メニューから、[ リレーション ラベルを表示 ]コマンドを選択して、リレーション名を表示します。 このコマンドをクリアして、リレーション名を非表示にします。