連載:Entity Framework 4.1入門

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

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

モデルを使ったサンプルの実装

 今回は、ItemクラスとMemberクラスのモデルを1つずつ新規作成して登録し、その後、登録した情報をコンソールに出力するだけの、シンプルなサンプルである。

 なお、以下のコードは基本的にデータベース・ファーストやモデル・ファーストの場合でもそのまま動作するものである。

class Program
{
  static void Main(string[] args)
  {
    // コンテキスト・クラスを作成
    using (var db = new ItemCatalog())
    {
      // Memberオブジェクト(モデル)の作成と追加
      var member = new Member
      {
        Name = "どい",
        Address = "世田谷",
        TelNo = "03-0000-0000"
      };
      db.Members.Add(member);

      // Itemオブジェクト(モデル)の作成と追加
      var item = new Item
      {
        Name = "パソコン",
        Member = member
      };
      db.Items.Add(item);

      // データベースへの保存処理
      int recordsAffected = db.SaveChanges();

      // LINQを使ったデータの取得
      var items = from i in db.Items select i;
      foreach (var i in items)
      {
        // 順に取り出して表示
        Console.WriteLine("Id: {0} , Name: {1} , Member Name: {2}", i.Id, i.Name,i.Member.Name);
      }
      // キー入力待ち
      Console.ReadKey();
    }
  }
}
Module Module1

  Sub Main()

    ' コンテキスト・クラスを作成
    Using db As New ItemCatalog

      ' Memberオブジェクト(モデル)の作成と追加
      Dim member = New Member With {
        .Name = "どい",
        .Address = "世田谷",
        .TelNo = "03-0000-0000"
      }
      db.Members.Add(member)

      ' Itemオブジェクト(モデル)の作成と追加
      Dim item = New Item With {
        .Name = "パソコン",
        .Member = member
      }
      db.Items.Add(item)

      ' データベースへの保存処理
      Dim recordsAffected = db.SaveChanges()

      ' LINQを使ったデータの取得
      Dim items = From i In db.Items Select i
      For Each i In items
        ' 順に取り出して表示
        Console.WriteLine("Id: {0} , Name: {1} , Member Name: {2}", i.Id, i.Name, i.Member.Name)
      Next
      ' キー入力待ち
      Console.ReadKey()
    End Using
  End Sub

End Module
リスト4 データの登録、表示を行うサンプル(上:Program.cs、下:Module1.vb)

 エンティティ・クラスの使用方法はEF 4までと同じく、実際のアクセスはコンテキスト・クラスを介して行う()。基本的なコードは似通っているため、EF 4でのサンプルと比較してほしい。

 なお、コンテキスト・クラスが以前のObjectContextクラスからDbContextクラスに変わっているため、作成したエンティティの追加が、AddTo○○メソッド(○○はエンティティ・クラス名)やAddObjectメソッド(POCOのエンティティ・クラスの場合)ではなく、コンテキスト・クラスでDbSet型として定義したコレクション(Items/Membersプロパティ)のAddメソッドに変わっている()。

 データの取得には、EF 4までの場合と同様にLINQを用いている()。ここではItemクラスのプロパティに加え、遅延ロードを用いてMemberクラスのプロパティも出力していることに注目してほしい()。

 以上が、EF 4.1のコード・ファースト開発スタイルでデータの保存、取得を行うサンプルである。ビルド後の実行結果は図6のようになる。

図6 サンプルの実行結果

データベース上のデータの確認

 それでは、以上のソース・コードが、規約によってどのようなデータベースに変換されるのか、実際のデータを確認してみよう。SQL ServerにアクセスするためのSQL Server Management Studioなどを使い、SQL Server Expressのデータベース一覧を確認すると、図7のようにデータベースとテーブルが作成されていることが確認できる。

図7 自動生成されたデータベースとテーブル

 今回は設定ファイル(App.config)に接続文字列を定義しなかったため、規約に沿ってコンテキスト・クラスの完全修飾名である「EFCodeFirstSampleCS.ItemCatalog」という名前(C#の場合。VBの場合は「EFCodeFirstSampleVB.ItemCatalog」)でデータベースが作成されている。

 また、エンティティ・クラスに対応するItems、Membersというテーブルも生成されている。Itemsテーブル、Membersテーブルの内容は、図8、図9のようになっており、ソース・コードで記述したのと同じデータが保存されていることが確認できる。

図8 Itemsテーブルの内容

 

図9 Membersテーブルの内容

 さらに、図10のようにItemsテーブルからMembersテーブルへのリレーションシップも自動的に作成されている。規約に沿って外部キーとしてMemberIdフィールドが使われている。キャプチャ画像は省略するが、MembersテーブルからItemsテーブルへのリレーションシップも同様に作成されている。

図10 ItemsテーブルからMembersテーブルへのリレーションシップ。外部キーはMemberIdフィールド

 以上、データベースの構造が最初に触れた規約どおりの定義となっていることに注目してほしい。さらに詳細な規約と実際の挙動については次回解説するが、今回はコード・ファーストによって簡潔なコードでデータベースを使ったアプリケーションを構築できる、という点を押さえておこう。

[コラム]SQL Server Compact 4.0を使用する場合

 前述のとおり、EFのコード・ファーストでは、規約に沿った接続文字列を記述しない場合、デフォルトのデータベースとしてSQL Server Expressを使用するようになっている。SQL Server Compact 4.0を使用する場合は、プロジェクトの設定ファイルに以下のように記述する。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <connectionStrings>
  <add name="ItemCatalog"
       connectionString="Data Source=|DataDirectory|SampleDatabase.sdf"
       providerName="System.Data.SqlServerCe.4.0"/>
  </connectionStrings>
</configuration>
リスト5 SQL Server Compact 4.0を使用するための設定例(App.config)

 ここでは、規約に従ってコンテキスト・クラス名と同じ、「ItemCatalog」という名前の接続文字列を定義している。providerNameプロパティに「System.Data.SqlServerCe.4.0」という値を指定することで、SQL Server Compact 4.0を使うように設定している。実際のデータ・ファイルは、「bin/Debug/ItemCatalog.sdf」など、実行時のフォルダに保存される。

まとめ

 連載初回となる今回は、「EF 4.1のコード・ファースト開発スタイルが、データベース・ファーストやモデル・ファーストとどのように異なるのか」を解説した。また、CoCが非常に有効に働くため、実際のコードが非常にシンプルであることも確認できた。ASP.NET MVCと同様、これまでのマイクロソフトのプロダクトとはやや毛色が異なるフレームワークである、と感じられるかもしれない。

 次回は、EF 4.1のコード・ファーストで使用されている規約の詳細や、規約に沿わない場合の明示的な設定方法について解説する。end of article


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

本日 月間