私はここでこの種の「不可思議な」問題を抱えています。私は現在、ASP.NET MVC3アプリケーションでEntityFramework 4.1 Code Firstアプローチを使用していますが、昨日まではうまく機能しました...
Database.SetInitializerが機能しなくなる原因となった、本当に悪いことが起こりました。説明:
私はこの単純なモデルを持っています
public class User
{
public int Id { get; set; }
public int RoleId { get; set; }
[Required]
[StringLength(50)]
[DataType(DataType.Text)]
public string Login { get; set; }
[Required]
[StringLength(150)]
[DataType(DataType.EmailAddress)]
public string Email { get; set; }
[Required]
[StringLength(32)]
[DataType(DataType.Password)]
public string Password { get; set; }
[DataType(DataType.DateTime)]
public DateTime RegisteredDate { get; set; }
public virtual Role Role { get; set; }
}
そして、これが私のDbContextです
public class MyContext : DbContext
{
public DbSet<Models.User> Users { get; set; }
}
また、カスタム初期化子をセットアップします(テスト用)
public class MyInitializer
: DropCreateDatabaseIfModelChanges<MyContext>
{
}
これで、Web.config(MyContextと同じ名前)で接続文字列を既に設定しているので、Global.asaxでは、Application_Start()メソッドでこの単純なコードを呼び出しています。
Database.SetInitializer(new MyInitializer());
しかし問題はそれです Database.SetInitializer データベースを作成することはできません。さらに悪いことに、コンテキストからのテーブルで既存のデータベースを埋めようとさえしません...デバッグしようとしましたが、アプリケーションがデータベースの初期化コードを飛び越えているようです...
私は1つの解決策を見つけました、このコード行を使用することです
var ctx = new MyContext();
ctx.Database.Initialize(true);
だからここで私はとにかくDBを作成するためにコードを強制しています...
しかし、Database.SetInitializerが機能しないという事実は、本当に厄介です...以前はうまく機能していました。何が起こったのかわかりません。 Windowsのイベントジャーナル、SQLサーバーのログを調べましたが、何もありません。ただ沈黙。しかし、たぶん私は間違った場所を見ているだけですか? :S
誰かが何が起こっているのか教えてもらえますか?
P.S Visual Web Developer 2010 + SQL Server Express 2008R2を使用しています
データベースは、実際にコンテキストを使用する場合にのみ作成されます。
イニシャライザのSeedメソッドを次のようにオーバーライドした場合:
protected override void Seed(MyContext context){...}
Seedコードは、MyContextのインスタンスを使用する場合にのみ実行されます。
それがあなたが使うときにそれが働く理由です
var ctx = new MyContext();
ctx.Database.Initialize(true);
Global.asax.csのApplication_Start()メソッドでコンテキストを使用して、次のようにいつでも強制的に作成できます。
System.Data.Entity.Database.SetInitializer(new MyInitializer());
MyContext db = new MyContext();
db.Database.Initialize(true);
//or even something like db.Users.Count();
または、後でコンテキストを使用するときに作成されます。アプリケーションの起動時にコンテキストを使用するコードを削除したため、機能しなくなったように見える場合があります。
データベースを作成する別の方法
Database.SetInitializer(new CreateDatabaseIfNotExists<MyContext>());
var context = new MyContext();
context.Database.Create();
Global.asax.csで
Database.SetInitializer(new MigrateDatabaseToLatestVersion<ApplicationDbContext, DbMigrationConfig>());
ここで、DbMigrationConfigは、名前を変更したmigrationsフォルダーのConfigurationクラスです。また、構成のコンストラクターで自動移行を有効にしていることを確認してください