連載:ADO.NET Entity Framework入門

第4回 データベースからのEntity Data Model生成

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

 今回のテーマは、データベースからのEntity Data Model(以下EDM)の生成である。

 第1回から説明しているように、Entity Frameworkの理想は、まず概念モデルの設計があり、そこからデータベースの実装を行うことにあるといえる。しかし、現時点での開発においては、データベース設計が先にあり、プログラミング用のモデルとして概念モデルを後で設計するケースも多いだろう。

 また、概念モデルを先に設計している場合でも、Entity Frameworkのデータベース自動生成機能がシンプルな構造にしか対応していないことから、自動生成をあきらめ、データベースからEDMを生成するケースも考えられる。

 このように、既存のデータベースを解析し、モデルを生成することを、一般にデータベースのリバース(リバース・エンジニアリングの略)と呼ぶ。Entity Frameworkにおいても、Visual Studioの機能を使用することで、簡単なウィザードにより、データベースからのリバース処理を行える。何度も実行する機能であるため、しっかり手順を確認していこう。

 なお本稿では.NET Framework 4およびVisual Studio 2010をベースに解説を行っている。

データベースからのEDM生成

 それでは、前回までに自動生成してきたデータベースから、リバースにより新たにEDMを作成してみよう。

 今回はデータベース上にテーブルだけでなく、ストアド・プロシージャが存在するケースでEDM生成機能を試してみる。ストアド・プロシージャはリスト1のようなSQL文を記述して実行することにより作成できる。

 このストアド・プロシージャは、名前と年齢を引数に取り、指定された名前のエントリの年齢を更新するものである。

USE [AddressBook];
GO
CREATE PROCEDURE [dbo].[update_age]
(
  @name nvarchar(100),
  @age int
)
AS
UPDATE [entries] set [age]=@age where [name]=@name
GO
リスト1 年齢を更新するストアド・プロシージャ(SampleStoredProcedure.sql)

 次に、これまで使ってきたEDM定義であるAddressBook.edmxファイルを削除し、第1回と同じ流れで[プロジェクト]−[新しい項目の追加]を実行し、[新しい項目の追加]ダイアログで図1のように[ADO.NET Entity Data Model]を選択して、再度「AddressBook.edmx」という名前でEDMを作成する。


図1 EDMの追加

 これにより、図2のようにEntity Data Modelウィザードが表示される。今回はデータベースからのリバースのため、左の[データベースから生成]を選ぼう。


図2 Entity Data Modelウィザード
今回はデータベースからのリバースのため、左の[データベースから生成]を選択する。

 [データ接続の選択]ダイアログ(図3)では、すでにSQL Serverに接続するための接続文字列が選択されているはずなので、[次へ]を選択する。


図3 Entity Data Modelウィザードの[データ接続の選択]

 続くEntity Data Modelウィザードの[データベース オブジェクトの選択]ページ(図4)は重要である。ここには、SQL Server上に存在するテーブルやビュー、ストアド・プロシージャが一覧表示され、EDMに含めるオブジェクトを選択できる。

 ここではCategories、Entries、EntryCategoryの3つのテーブルと、update_ageストアド・プロシージャを選択しよう。


図4  Entity Data Modelウィザードの[データベース オブジェクトの選択]ページ
データベース上のオブジェクトが一覧表示される。

 なお、ここで[生成されたオブジェクトの名前を複数化または単数化する]というチェック・ボックスに注目したい。第1回でも、.NET Framework 4のEntity Frameworkより、エンティティ名の単数形、テーブル名の複数形がサポートされたことに触れたが、データベースからのリバースの際にも、単数/複数形がサポートされている。このチェック・ボックスをチェックしない状態(デフォルト)では、エンティティ名はテーブル名と同じになるが、このチェック・ボックスをチェックすると、テーブル名が複数形の場合は、エンティティ名は単数形で生成される。

 今回の例では、チェックしない状態では「Categories」と「Entries」というエンティティ・クラスが生成されるのに対し、チェックすると「Category」と「Entry」というエンティティ・クラスが生成される。クラス名を単数形とする一般的な命名則から考えると、このチェック・ボックスはチェックするのが望ましいだろう。データベース・オブジェクトの命名則として、英語表記を基本にしている開発者にとって、これは好ましい改善点である。

 [完了]ボタンをクリックすると、データベースからのリバース処理が行われ、図5のようなEDMの構造が表示される。


図5 データベースからのリバースで生成されたEDM

 生成されたEDMを確認すると、

  • エンティティ間のアソシエーションの接続性が両方とも「*」になっている(=多対多)
  • 中間テーブルであるEntryCategoryテーブルに対応するエンティティが存在しない
  • ナビゲーション・プロパティの名前がEntries、Categoriesと、両方とも複数形

などから、多対多関係がきちんと再現されていることが確認できる。このように、データベースからのリバースの際には、データベース上の外部キーなどの情報を元に、適切な構造が構築される。

 以上の流れでデータベースからのリバースによるEDMの生成を行うことができた。なお、データベースからのリバース処理は1回に限られておらず、EDM→データベース、データベース→EDM両方の変換を何度でも実行できる。その場合、更新されたエンティティやテーブルの情報が相互に反映されるようになっている。

 

 INDEX
  ADO.NET Entity Framework入門
  第4回 データベースからのEntity Data Model生成
  1.データベースからのEDM生成
    2.ストアド・プロシージャの呼び出し
    3.複合型の活用/まとめ
 
インデックス・ページヘ  「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 記事ランキング

本日 月間