連載:ADO.NET Entity Framework入門

第2回 EDMにおける多対多関係とEntity Frameworkでのデータの取得/保存

WINGSプロジェクト 土井 毅 著/山田 祥寛 監修
2010/07/09
Page1 Page2 Page3 Page4

 前回では、Entity Frameworkの概要を解説し、シンプルなEntity Data Model(以下EDM)を作成した。今回は、より複雑な構造を持つ概念モデルをEntity Frameworkでどのように扱えるか、多対多関係を持つエンティティをサンプルとして解説する。

 また、EDMをアプリケーションからどのように呼び出すことができるか、データの取得・保存方法についても解説していく。

多対多関係の実現

 前回のサンプルでは1つのエンティティを作成し、概念モデルからデータベースを自動生成した。今回は前回のサンプルの続きとして、多対多関係(「n対n関係」とも呼ばれる)を持つエンティティを概念モデルで設計しよう。

■Categoryエンティティの作成

 前回はアドレス帳アプリケーションのアドレス帳エントリであるEntryエンティティを作成したので、今回はエントリのカテゴリであるCategoryエンティティを作成する。なお、各エントリは複数のカテゴリを持つことができ、各カテゴリは複数のエントリを持つことができる、多対多関係となっている。

 まず、Visual Studio 2010(以降、VS 2010)で前回作成したAddressBook.edmxファイルを開き、ツールボックスからエンティティをドラッグ&ドロップして配置する。

 エンティティの名称を「Category」とし、カテゴリ名としてCategoryNameプロパティ、カテゴリ詳細としてDetailプロパティをそれぞれString型として作成する。(図1)


図1 Categoryエンティティの作成
String型のCategoryNameプロパティとDetailプロパティを持つ。

■アソシエーションの作成

 続けて、EntryエンティティとCategoryエンティティの間に多対多関係を作成しよう。

 ツールボックスでアソシエーションをクリックし、EntryエンティティとCategoryエンティティを続けてクリックすることで、エンティティ間のアソシエーションを作成することができる。なお、デフォルトでは1対多関係のアソシエーションが作成されるため、[プロパティ]ペインで多対多関係に修正する必要がある。(図2)


図2 多対多関係のアソシエーションのプロパティ
「End1の複数要素の接続性」を「*」に、「End2のナビゲーション プロパティ」を「Entries」に設定している。

 ここはやや複雑なプロパティ設定となるため、順を追って説明しよう。[プロパティ]ペインのEnd1、End2とは、アソシエーションの始点(Entry)と終点(Category)のエンティティに対応している。ここで修正するのは「End1の複数要素の接続性」と「End2のナビゲーション プロパティ」という部分である。

 まず「複数要素の接続性」とは、一対一、一対多、多対多など、このアソシエーションに関連付けられるエンティティの数量を表している。デフォルトでは、End1(Entryエンティティ)が「1」、End2(Categoryエンティティ)が「*」の一対多関係となっている。これを、図2のように、「End1の複数要素の接続性」も「*」(複数を意味する)に設定することで、多対多関係のアソシエーションとすることができる。図3のようにアソシエーションの始点、終点に「*」が表示され、多対多関係となっていることに注目。


図3 2つのエンティティ間に設定された多対多関係のアソシエーション
2つのエンティティを結ぶラインの両端に、複数を意味する「*」が表示されている。

 一方、「ナビゲーション・プロパティ」とは、あるエンティティから、アソシエーションでつながれた別のエンティティにアクセスするためのプロパティのことである。

 例えば「End1のナビゲーション プロパティ」は「Categories」という値になっている。これは、EntryエンティティのCategoriesプロパティにより、複数のCategoryエンティティを取得できることを意味する。デフォルトでは1対多関係のアソシエーションとして、「End2のナビゲーション プロパティ」は「Entry」という値になっているので、これを「Entries」に修正する。

 以上の修正により、EntryエンティティとCategoryエンティティは多対多のアソシエーションで関連付けられ、それぞれのCategories、Entriesというナビゲーション・プロパティを介して、関連付けられた複数のエンティティの値を取得できるようになっている。

 

 INDEX
  ADO.NET Entity Framework入門
  第2回 EDMにおける多対多関係とEntity Frameworkでのデータの取得/保存
  1.多対多関係の実現
    2.EDMからデータベースの自動生成
    3.Entity Frameworkで自動生成されるクラス
    4.Entity Frameworkでのデータ保存/取得サンプル
 
インデックス・ページヘ  「ADO.NET Entity Framework入門」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間