web-dev-qa-db-ja.com

Entity FrameworkDatabase.SetInitializerが機能しない

私はここでこの種の「不可思議な」問題を抱えています。私は現在、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を使用しています

16
geCoder

データベースは、実際にコンテキストを使用する場合にのみ作成されます。

イニシャライザの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();

または、後でコンテキストを使用するときに作成されます。アプリケーションの起動時にコンテキストを使用するコードを削除したため、機能しなくなったように見える場合があります。

43
woggles

データベースを作成する別の方法

Database.SetInitializer(new CreateDatabaseIfNotExists<MyContext>());

var context = new MyContext();
context.Database.Create();
0
Dimitri

Global.asax.csで

Database.SetInitializer(new MigrateDatabaseToLatestVersion<ApplicationDbContext, DbMigrationConfig>());

ここで、DbMigrationConfigは、名前を変更したmigrationsフォルダーのConfigurationクラスです。また、構成のコンストラクターで自動移行を有効にしていることを確認してください

0
Bajju