連載:ADO.NET Entity Framework入門

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

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

■データベースの自動生成

 EDMに関する作業は以上で完了したので、EDMからデータベースを自動生成しよう。前回と同じようにADO.NET Entity Data Modelツール上で右クリックし、[モデルからデータベースを作成]を実行する。


図4 多対多関係のEDMからデータベースを自動生成

 生成されたスクリプトを実行すると、データベース上のテーブル構造は図5のようになる。


図5 データベースに生成されたテーブル構造
サーバ・エクスプローラで表示。3つのテーブルが含まれているのが分かる。

 前回から存在するEntriesテーブル、今回追加したCategoriesテーブルだけでなく、EntryCategoryというテーブルが追加されていることに注目したい。これは、多対多関係を実現するための中間テーブルである。図6のように、EDM上の多対多アソシエーションが、データベース上では中間テーブルとして実現されている。EDM上では中間テーブルに対応するエンティティが存在しないことに注目してほしい。


図6 EDMと生成されたデータベースの関係
EDM上の2つのエンティティに対して、データベース上では中間テーブルを含めた3つのテーブルが自動生成される。

■マッピングの詳細

 EDMと実際のデータベースの対応関係について、もう少し確認しておこう。ADO.NET Entity Data Modelツールの下のペインの[マッピングの詳細]タブで、EDMとデータベースのマッピングの詳細を確認することができる。

 例えばEntryエンティティ、Categoryエンティティのマッピング詳細は図7、図8のようになる。左側がデータベース上のフィールド、右側がEDMのプロパティを指している。それぞれ、Entriesテーブル、Categoriesテーブルの各フィールド(=列)に対応していることが確認できる。


図7 Entryエンティティのマッピング詳細
Entriesテーブルの各フィールドに対応している。


図8 Categoryエンティティのマッピング詳細
Categoriesテーブルの各フィールドに対応している。

 そして、注目したいのはEntry/Categoryエンティティ間のアソシエーションのマッピングである(図9)。なお、ここでは左側がEDMのプロパティ、右側がデータベース上のフィールドを指していることに注意してほしい。


図9 Entry/Categoryエンティティ間のアソシエーションのマッピング詳細
左側がEDMのプロパティ、右側がデータベース上のフィールドを指している。

 このマッピングを見れば、EntryCategoryテーブルのEntries_IDフィールド、Categories_IDフィールドが、それぞれEntryエンティティ、CategoryエンティティのIDプロパティに対応していることが分かる。

 このように多対多関係を中間テーブルで表現するのは一般的な正規化の手法である。しかし、今回のようにアソシエーションのプロパティを設定するだけで、自動的に中間テーブルが生成される点、また後述するように、アプリケーションからは中間テーブルの存在を意識することなく実装が可能である点がEntity Frameworkでのメリットといえるだろう。

【コラム】[マッピングの詳細]タブの機能

 [マッピングの詳細]タブを使うことで、すでに存在するデータベース上のフィールドと、EDMのプロパティを任意に対応付けることができる。ただし、これはあくまで「マッピング」を行うための機能であり、一般的なデータベース・モデリング・ツールのように、ここから新しいテーブルやフィールドを作成することはできない。

 現状のEntity Frameworkにおいては、テーブルやフィールドの作成は、[モデルからデータベースを作成]機能による自動生成のみに限られているようである。また、この自動生成は1つのエンティティに対して1つのテーブルを、プロパティに対して同名のフィールドを作成するようになっており、EDM上のプロパティ名とテーブルのフィールド名を異なるものにしたり、1つのエンティティに対して複数のテーブルを関係付けて自動生成したりすることはできない。

 一方で、データベースにすでに存在するテーブル、フィールドであれば、[マッピングの詳細]タブを用いることで、異なる名前のプロパティとの関連付けや、複数テーブルを1つのエンティティに混在させることも可能である。この点での機能の非対称性は、前回の最後に記したとおり、Entity Frameworkがデータベースのリバースを前提として作成され、モデル・ファーストの機能が後付けされたことが原因と思われる。今後のリリースに期待したい。



 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 記事ランキング

本日 月間