しばやん雑記

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

Entity Framework CTP4 を使う上での注意点

ローカルでは SQL Server Compact 4 で問題なかったのですが、本番サーバーの SQL Server 2008 へ繋ごうとした時に以下の問題が起きました。

  1. RecreateDatabaseIfModelChanges や CreateDatabaseOnlyIfNotExists が動作しない
  2. Database.SetInitializer を呼び出せというエラーが表示される
  3. SQL Server へのログインに失敗する

RecreateDatabaseIfModelChanges などはそもそも対応していないっぽかったのですが、それ以外の症状の原因はメタデータとモデルの変更追跡?だったようです。

なので DbContext を継承したクラスで OnModelCreating をオーバーライドして ModelBuilder のプロパティを少し変更します。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.IncludeMetadataInDatabase = false;
}

このプロパティの意味はよくわからないのですが、DB にメタデータを含めないとかそんな意味でしょう。

とりあえずこれで DB に接続できるようになりましたが、次はモデルが変化しているから Database.SetInitializer を呼び出して DB を作り直せみたいなエラーが出ます。

これは変更追跡?を無効にすれば解決しました。Global.asax.cs に追記します。

protected void Application_Start()
{
    Database.SetInitializer<TContext>(null);
}

これで、エラーが出なくなり安定して使えるようになりました。まだまだ Entity Framework は情報が少なくて大変ですね。