しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

Entity Framework のコード・ファーストでテーブルを作成する

前回はモデルクラスを命名規約と ModelBuilder の Fluent API を使って作成するところまで書きました。今回はそのモデルからテーブルを作成していきます。

テーブルを作成する

Entity Framework CTP 4 には System.Data.Entity.Infrastructure 名前空間に Database クラスが用意されています。テーブルは次のコードを書くだけで自動的に作成されます。

// ProductContext は前回作成した DbContext を継承したクラス
Database.SetInitializer<ProductContext>(new RecreateDatabaseIfModelChanges<ProductContext>());

Database.SetInitializer<TContext> メソッドの引数に指定するイニシャライザによって自動生成の挙動を変更することが出来ます。今は RecreateDatabaseIfModelChanges<TContext> クラスを指定しているので、モデルクラスに変更があった時に作り直すような設定になっています。

イニシャライザには次のように 3 種類あり、それぞれの動作は名前の通りです。

  • AlwaysRecreateDatabase<TContext>
  • CreateDatabaseOnlyIfNotExists<TContext>
  • RecreateDatabaseIfModelChanges<TContext>

初期データを追加する

先ほど挙げた Database.SetInitializer<TContext> に指定するイニシャライザを継承して Seed メソッドをオーバーライドすると、メソッドはテーブルが作成されたタイミングで呼び出されるので必要なデータをテーブルが作成されたタイミングで追加することが出来ます。

public class ProductInitializer : RecreateDatabaseIfModelChanges<ProductContext>
{
    public void override Seed(ProductContext context)
    {
        // あらかじめ必要なデータを追加する
        context.Products.Add(new Product { Name = "test" });

        // 変更を保存
        context.SaveChanges();
    }
}

RecreateDatabaseIfModelChanges を指定するとモデルクラスの変更のたびにデータベースの再生成が行われるので、テスト用のデータなどはこのメソッドで追加する処理を書いておくと良いです。ちゃんと DbContext も引数で渡してくれます。