2012-03-13 22 views
5

EFコードファーストでデータベースを再初期化しようとしています。私の最初の考えは、呼び出すことがあった。EFコードファースト - データベースを削除してデータベースを作成した後にシードする

dbContext.Database.Delete();  
dbContext.Database.Create(); 

これは、新しいデータベースを作成しますが、播種戦略(Database.SetInitializer <を使用してセット>)が無視されます。私は上記のApplication_Startメソッドを実行しています。何か案は?

私も試してみました:

dbContext.Database.Initialize(true); 
+0

あなたDatabase.SetInitializer <>コードを投稿することができますか? –

答えて

0

一つの選択肢をDropCreateDatabaseAlwaysから継承し、独自のDatabaseInitializerを作成することです。

この例があります。

public class MyInitializer : DropCreateDatabaseAlways<EmployeeContext> 
{ 
    protected override void Seed(EmployeeContext context) 
    { 
     context.Employees.Add(new Employee() {FirstName = "Marcy"}); 
     base.Seed(context); 
    } 
} 

public class EmployeeContext : DbContext 
{ 
    static EmployeeContext() 
    { 
     Database.SetInitializer(new MyInitializer()); // using my own initializer 
    } 

    public IDbSet<Employee> Employees { get; set; } 
} 
+0

はい。私はすでにそれをしています。しかし、私はそれを強制的に実行することはできません(モデルを変更することなく)。 –

0

は、ここで私はこれを克服するためにやったことだ:

  1. は、パブリックブールが= falseをWasSeededあなたのコンテキストの初期化に

    をフラグを追加します。

  2. イニシャライザでパブリックメソッドを作成し、シードコードをそこに配置します。 context.Students.AddOrUpdate

    は真

    にフラグを設定し終わり

:私は前にデータをDBにないチェックすなわち、唯一AddOrUpdateまたは他のUPSERTの方法を使用して確認しました

  1. あなたはコンテキストを初期化した後、フラグをチェックし、それが偽の実行を手動でロジックの場合:

    場合 {(initializer.WasSeeded!)initializer.SeedAndUpsert(context); }

0
Database.SetInitializer(new CustomInitializer()); //CustomInitializer contains the overriding Seed method 

using (var context = new CustomDatabaseContext()) 
{ 
    context.Database.Initialize(force: true); 
} 
関連する問題