連載:Entity Framework 4.1入門

第1回 EF 4.1の目玉機能「コード・ファースト」を理解しよう

WINGSプロジェクト 土井 毅(監修:山田 祥寛)
2011/06/03
Page1 Page2 Page3

環境構築

 本連載では、以下の環境でサンプル作成を行う。

  • Visual Studio 2010 SP1(以降、VS 2010 SP1)
  • SQL Server Compact 4.0(初回のみSQL Server 2008 R2 Expressも使用)
  • Entity Framework 4.1

 EF 4.1は以下のURLからダウンロードすることができる(図3)。なお、インストールはウィザードに沿って進むだけで、特別な設定は不要のため、解説は省略する。

図3 Microsoft Download Center - ADO.NET Entity Framework 4.1

 なお、単体インストーラでのインストールのほかに、「NuGet」と呼ばれるVisual Studio用のパッケージ管理ツールを使ってEF 4.1をインストールすることもできる。NuGetを使ったインストールについては、前述の「ASP.NET MVC入門 第2回 Entity Frameworkコード・ファーストでモデル開発」を参照していただきたい。

 EFはデフォルトではデータベースとしてSQL Server Expressを使用するようになっているが、最近リリースされたSQL Server Compact 4.0との組み合わせをぜひお勧めしておきたい。SQL Server Compact 4.0は、インストールなしで、管理者権限も不要な無償の組み込み用データベース・エンジンである。SQL Server Compact 4.0を使うことで、アプリケーションの配布先でデータベースがインストールされているかどうかを気にすることなく、お手軽にデータベースを活用できる。

 VS 2010 SP1においては、SQL Server Compact 4.0のデータベース・ファイルがサポートされており、SQL Serverなどと同様にデータベースの構造やデータを閲覧/編集できるようになっている。ただしVS 2010 SP1にSQL Server Compact 4.0自体は含まれていないため、以下のURLからダウンロードしてインストールする必要がある。

 ただし、初回のサンプルのみは、コード・ファーストにおいて設定が一切必要ないことを示すため、SQL Server 2008 R2 Expressで動作させる。

コード・ファーストによるサンプルの実装

 ではさっそく、コード・ファーストを利用したサンプルを実装していこう。今回は図4のような構造を持つモデルを使った、商品管理のサンプルとする。

図4 今回のサンプルで扱うモデル

 Itemクラスが商品を表し、Memberクラスがその商品を所有するユーザーを表している。MemberクラスとItemクラスは1対多の関係を持っており、ItemクラスのMemberIdプロパティがMemberクラスへの外部キーの役割を持っている。データベース上では2つのテーブルで表される、シンプルなモデルである。

 VS 2010 SP1で「コンソール アプリケーション」として新しいプロジェクトを作成しよう。今回は「EFCodeFirstSampleCS」(C#版)/「EFCodeFirstSampleVB」(VB:Visual Basic版)という名称で作成した。

 最初に、EF 4.1をプロジェクトから使用するため、(メニューバーの)[プロジェクト]−[参照の追加]から図5のように、[.NET]タブで「EntityFramework」アセンブリを追加しよう。[バージョン]が「4.1.0.0」となっていることに注目してほしい。

図5 EF 4.1への参照の追加

モデルの定義

 それでは、先ほど示した商品管理のモデルを定義しよう。

 エンティティ・クラスとしてリスト1、リスト2のようにItemクラス、Memberクラスを定義する。

public class Item
{
  public int Id { get; set; } // 商品ID
  public int Price { get; set; } // 商品価格
  public int MemberId { get; set; } // 会員ID
  public string Name { get; set; } // 商品名
  public Nullable<System.DateTime> SoldAt { get; set; } // 売却日付
  public virtual Member Member { get; set; } // 会員
}
Public Class Item
  Public Property Id As Integer ' 商品ID
  Public Property Price As Integer ' 商品価格
  Public Property MemberId As Integer ' 会員ID
  Public Property Name As String ' 商品名
  Public Property SoldAt As Nullable(Of System.DateTime) ' 売却日付
  Public Overridable Property Member As Member ' 会員
End Class
リスト1 Itemクラス定義(上:Item.cs、下:Item.vb)

public class Member
{
  public int Id { get; set; } // 会員ID
  public string Name { get; set; } // 会員名
  public string Address { get; set; }// 住所
  public string TelNo { get; set; } // 電話番号
  public virtual ICollection<Item> Items { get; set; } // 商品一覧
}
Public Class Member
  Public Property Id As Integer ' 会員ID
  Public Property Name As String ' 会員名
  Public Property Address As String ' 住所
  Public Property TelNo As String ' 電話番号
  Public Overridable Property Items As ICollection(Of Item) ' 商品一覧
End Class
リスト2 Memberクラス定義(上:Member.cs、下:Member.vb)

 どちらのクラスも、特定のクラスやインターフェイスに依存しないPOCOであることに注目してほしい。

 今回用いている基本的な規約は以下のとおりである。なお、規約の詳細とカスタマイズ方法については次回解説する。

  • エンティティ・クラスはデータベースのテーブルに変換される。テーブル名はエンティティ・クラス名の複数形が用いられる(Item/Memberクラス→Items/Membersテーブル)

  • エンティティ・クラスのプロパティはデータベースのフィールドになる

  • エンティティ・クラスを参照するプロパティは「ナビゲーション・プロパティ」と呼ばれ、データベース上ではリレーションシップとして扱われる(Item.Member/Member.Itemsプロパティ)

  • リレーションシップの外部キーは「相手のクラス名+Id」という名前のプロパティが使われる(Item.MemberIdプロパティはMemberクラスへの外部キーになる)

  • ナビゲーション・プロパティをvirtual(C#)/Overridable(VB)というキーワード付きで宣言すると、遅延ロードが行われる

 以上に加えて、もう1つ定義する必要があるのが、これらのエンティティ・クラスにアクセスするためのコンテキスト・クラスである。データベースへの接続やデータの取得、保存など、EFを使ったデータベースへのアクセスは、すべてこのコンテキスト・クラスを介して行うことになる。

 コンテキスト・クラスはリスト3のように、EF 4.1で提供されるDbContextというクラスを継承させて定義する。今回はItemCatalogという名前でコンテキスト・クラスを作成する。

public class ItemCatalog : DbContext
{
  public DbSet<Item> Items { get; set; }
  public DbSet<Member> Members { get; set; }
}
Public Class ItemCatalog
  Inherits DbContext

  Public Property Items As DbSet(Of Item)
  Public Property Members As DbSet(Of Member)
End Class
リスト3 DbContextクラスを継承させて定義したコンテキスト・クラス(上:ItemCatalog.cs、下:ItemCatalog.vb)

 コンテキスト・クラスでは、DbSetという型で、アクセスしたいエンティティ・クラスの一覧に対応するプロパティを定義する。ここではItem一覧、Member一覧に対応するItems、Membersというプロパティを定義している。

コンテキスト・クラスについての規約は以下のとおりである。

  • 設定ファイル*2で定義するデータベースの接続文字列のうち、コンテキスト・クラス名と同じ名前のものが使用される

  • 接続文字列が定義されていない場合は、ローカルのSQL Server Expressインスタンスに名前空間を含むコンテキスト・クラスの完全修飾名でデータベースが作成される

*2 コンソール・アプリケーションであればApp.configファイル。ASP.NETであればWeb.configファイル。

 モデルの定義は以上である。規約に沿って定義を行うことで、データベースに関連した特別な記述がほとんどなかったことに注目してほしい。

 続いて次のページでは、以上で定義したモデルを使ったサンプルを実装しよう。  


 INDEX
  [連載]Entity Framework 4.1入門
  第1回 EF 4.1の目玉機能「コード・ファースト」を理解しよう
    1.Entity Framework 4.1の概要
  2.環境構築/コード・ファーストによるサンプルの実装:モデルの定義
    3.モデルを使ったサンプルの実装/データベース上のデータの確認

インデックス・ページヘ  「連載:Entity Framework 4.1入門」


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

本日 月間