リレーションシップ - EF デザイナー

Note

このページでは、EF デザイナーを使用してモデル内のリレーションシップを設定する方法について説明しています。 EF でのリレーションシップの一般的な情報と、リレーションシップを使用してデータのアクセスと操作を行う方法については、リレーションシップとナビゲーション プロパティに関するページを参照してください。

アソシエーションは、モデル内のエンティティ型の間のリレーションシップを定義します。 このトピックでは、アソシエーションを Entity Framework デザイナー (EF デザイナー) とマップする方法について説明します。 次の図は、EF Designer での作業時に使用されるメイン ウィンドウを示しています。

EF Designer

Note

概念モデルをビルドすると、マップされていないエンティティとアソシエーションについての警告が [エラー一覧] に表示される場合があります。 モデルからデータベースを生成することを選択すると、エラーが解消されるため、これらの警告は無視してかまいません。

アソシエーションの概要

EF デザイナーを使用してモデルをデザインする場合、.edmx ファイルがモデルを表します。 .edmx ファイルで、Association 要素は 2 つのエンティティ型間のリレーションシップを定義します。 アソシエーションでは、リレーションシップに関連するエンティティ型、およびリレーションシップの各 End におけるエンティティ型の数 (多重度と呼ばれる) を指定する必要があります。 アソシエーション End の多重度には、1 (1)、ゼロか 1 (0..1)、または多数 (*) の値を指定できます。 この情報は、2 つの子 End 要素で指定されます。

実行時に、アソシエーションの一方の端にあるエンティティ型のインスタンスには、ナビゲーション プロパティまたは外部キー (エンティティで外部キーを公開することを選択した場合) を使用してアクセスできます。 外部キーが公開されている場合、エンティティ間のリレーションシップは、ReferentialConstraint 要素 (Association 要素の子要素) を使用して管理されます。 エンティティでリレーションシップの外部キーを常に公開することをお勧めします。

Note

多対多 (*:*) の場合は、エンティティに外部キーを追加できません。 *:* リレーションシップでは、アソシエーション情報は独立したオブジェクトを使用して管理されます。

CSDL 要素 (ReferentialConstraintAssociation など) の詳細については、「CSDL 仕様」を参照してください。

アソシエーションを作成および削除する

EF デザイナーでアソシエーションを作成すると、.edmx ファイルのモデル コンテンツが更新されます。 アソシエーションを作成した後、アソシエーションのマッピングを作成する必要があります (このトピックの後の方で説明します)。

Note

このセクションでは、作成するアソシエーションの対象となるエンティティが既にモデルに追加してあることを前提としています。

アソシエーションを作成するには

  1. デザイン サーフェイスの空の領域を右クリックし、[新規追加] をポイントして、[アソシエーション] を選択します。

  2. [アソシエーションの追加] ダイアログでアソシエーションの設定を入力します。

    Add Association

    Note

    アソシエーションの端にあるエンティティにナビゲーション プロパティや外部キー プロパティを追加しない場合は、**[ナビゲーション プロパティ]** および **[<エンティティ型名> エンティティへの外部キー プロパティの追加]** チェック ボックスをオフにします。 ナビゲーション プロパティを 1 つだけ追加する場合、アソシエーションの検査は一方向のみ可能になります。 ナビゲーション プロパティを追加しない場合、アソシエーションの End にあるエンティティにアクセスするには、外部キー プロパティを追加する必要があります。

  3. [OK] をクリックします。

アソシエーションを削除するには

アソシエーションを削除するには、次のいずれかの操作を行います。

  • EF デザイナー サーフェイスでアソシエーションを右クリックし、[削除] を選択します。

  • または -

  • 1 つまたは複数のアソシエーションを選択し、nullDelnull キーを押します。

エンティティに外部キー プロパティを含める (参照に関する制約)

エンティティでリレーションシップの外部キーを常に公開することをお勧めします。 Entity Framework は、参照に関する制約を使用して、プロパティがリレーションシップの外部キーとして機能することを識別します。

リレーションシップの作成時に [<エンティティ型名> エンティティへの外部キー プロパティの追加] チェック ボックスをオンにした場合は、この参照に関する制約が追加されています。

EF デザイナーを使用して参照に関する制約を追加または編集すると、EF デザイナーにより .edmx ファイルの CSDL コンテンツで ReferentialConstraint 要素が追加または変更されます。

  • 編集するアソシエーションをダブルクリックします。 [参照に関する制約] ダイアログ ボックスが表示されます。

  • [プリンシパル] ドロップダウン リストから、参照に関する制約のプリンシパル エンティティを選択します。 エンティティのキー プロパティが、ダイアログ ボックスの [プリンシパル キー] の一覧に追加されます。

  • [依存] ドロップダウン リストから、参照に関する制約の依存エンティティを選択します。

  • 依存キーがある各プリンシパル キーについて、[依存キー] 列のドロップダウン リストから対応する依存キーを選択します。

    Ref Constraint

  • [OK] をクリックします。

アソシエーションのマッピングを作成および編集する

EF デザイナーの [マッピングの詳細] ウィンドウで、アソシエーションがデータベースにどのようにマップされるかを指定できます。

Note

参照に関する制約が指定されていないアソシエーションについてのみ、詳細をマップできます。 参照に関する制約が指定されている場合は、外部キー プロパティがエンティティに含まれており、エンティティの [マッピングの詳細] を使用して、外部キーのマップ先となる列を制御できます。

アソシエーションのマッピングを作成する

  • デザイン サーフェイスでアソシエーションを右クリックし、[テーブル マッピング] を選択します。 これにより、[マッピングの詳細] ウィンドウにアソシエーションのマッピングが表示されます。

  • [テーブルまたはビューの追加] をクリックします。 ストレージ モデル内のすべてのテーブルを示すドロップダウン リストが表示されます。

  • アソシエーションがマップされるテーブルを選択します。 [マッピングの詳細] ウィンドウには、アソシエーションの両端と、各 End のエンティティ型のキー プロパティが表示されます。

  • 各キー プロパティの [列] フィールドをクリックし、プロパティがマップされる列を選択します。

    Mapping Details 4

アソシエーションのマッピングを編集する

  • デザイン サーフェイスでアソシエーションを右クリックし、[テーブル マッピング] を選択します。 これにより、[マッピングの詳細] ウィンドウにアソシエーションのマッピングが表示されます。
  • [<テーブル名> にマップ] をクリックします。 ストレージ モデル内のすべてのテーブルを示すドロップダウン リストが表示されます。
  • アソシエーションがマップされるテーブルを選択します。 [マッピングの詳細] ウィンドウには、アソシエーションの両端と、各 End のエンティティ型のキー プロパティが表示されます。
  • 各キー プロパティの [列] フィールドをクリックし、プロパティがマップされる列を選択します。

ナビゲーション プロパティを編集および削除する

ナビゲーション プロパティは、モデル内のアソシエーションの端にあるエンティティを見つけるために使用されるショートカット プロパティです。 ナビゲーション プロパティは、2 つのエンティティ型の間のアソシエーションを作成するときに作成できます。

ナビゲーション プロパティを編集するには

  • EF デザイナー サーフェイスでナビゲーション プロパティを選択します。 ナビゲーション プロパティに関する情報は、Visual Studio の [プロパティ] ウィンドウに表示されます。
  • [プロパティ] ウィンドウで、プロパティの設定を変更します。

ナビゲーション プロパティを削除するには

  • 外部キーが概念モデルのエンティティ型で公開されない場合、ナビゲーション プロパティを削除すると、対応するアソシエーションの検査が一方向のみ可能になるか、またはまったく検査できなくなる可能性があります。
  • EF デザイナー サーフェイスでナビゲーション プロパティを右クリックし、[削除] を選択します。