連載:ADO.NET Entity Framework入門第2回 EDMにおける多対多関係とEntity Frameworkでのデータの取得/保存WINGSプロジェクト 土井 毅 著/山田 祥寛 監修2010/07/09 |
|
|
■データベースの自動生成
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入門」 |
- 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|