ローカルでは SQL Server Compact 4 で問題なかったのですが、本番サーバーの SQL Server 2008 へ繋ごうとした時に以下の問題が起きました。
- RecreateDatabaseIfModelChanges や CreateDatabaseOnlyIfNotExists が動作しない
- Database.SetInitializer を呼び出せというエラーが表示される
- 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 は情報が少なくて大変ですね。