2016-06-30 6 views
1

私はEFコード最初のプロジェクトを持っていると私は、私は、コードの上に使用するWCFサービスを持っているデータベースにEFコードの最初の移行シナリオでSeedメソッドが再度呼び出されるのはなぜですか?

internal sealed class Configuration : DbMigrationsConfiguration<myDB> 
    { 
     public Configuration() 
     { 
      AutomaticMigrationsEnabled = false; 
      ContextKey = "myDB.Auth.Service.DAL.myDB"; 
     } 

     protected override void Seed(myDBdb) 
     { 
      var mProduct = new Product 
      { 
       Name = "default product", 
       CreatedDate = DateTime.Now 
      }; 

      db.Products.AddOrUpdate(mProduct); 
      db.SaveChanges(); 
     } 
} 

をシードする方法があります。私が気づいているのは、wcfサービス(Visual StudioまたはIISのいずれか)を再起動するたびに、上記のコードが呼び出されるということです。その結果、複数の「デフォルト製品」がデータベースに追加され、誰もその理由を知ることができますか?

答えて

0

は、以下のことを試してください:あなたが初めてのためのデータの初期化のためのアプリケーションを使用している場合は

protected override void Seed(myDBdb) 
{ 
    var mProduct = new Product 
    { 
     Id = 1, 
     Name = "default product", 
     CreatedDate = DateTime.Now 
    }; 

    db.Products.AddOrUpdate(mProduct); 
    db.SaveChanges(); 
} 
0

DropCreateDatabaseAlwaysを使用してください。例えば:

public class MyClass : DropCreateDatabaseAlways<connectionstringContextName> 
{ 
    protected override void Seed(MyContext context) 
    { 
     // Your seed data 
    } 
} 
+0

に更新-データベース
を入力しますが、データベースは、(私はデータベースを右シード・データを使用して作成されたコードを実行する最初の時間)、すでにそこにあります。エンティティフレームワークは自動的にそのフレームワークを見つけられませんか? – daxu

0

すべての更新データベースの後に移行シードが実行されるため、既存のものをテストするかAddOrUpdateを使用してスクリプトの冪等付けを行う必要があります。データベース作成時にシードしたいだけの場合は、データベースの作成時にのみ実行される別のコンテキストシードメソッドがあります。

https://blog.oneunicorn.com/2013/05/28/database-initializer-and-migrations-seed-methods/

AddOrUpdate for seeding

編集:あなたはMigrateDatabaseToLatestVersion初期化子を使用する場合

、あなたのシード方法は、アプリケーションが実行されるたびに実行されます。あなたがこのプロセスを制御したい場合は、nullにあなたの初期化子を切り替える:

Database.SetInitializer(new NullDatabaseInitializer<ApplicationDbContext>()); 

し、必要なときにだけ、手動でマイグレーションを実行します。さらに一歩それを取るために、あなたがあなた自身の初期化子を書いて、あなたは、データベースが存在しない場合のいずれかやりたいことや、データベースを更新する必要がありますすることができます

Database.SetInitializer(new ValidateDbInitializer<ApplicationDbContext>()); 

// ref: https://coding.abel.nu/2012/03/prevent-ef-migrations-from-creating-or-changing-the-database/ 
public class ValidateDbInitializer<TContext> : IDatabaseInitializer<TContext> 
    where TContext : ApplicationDbContext 
{ 
    public void InitializeDatabase(TContext context) 
    { 
     if (!context.Database.Exists()) 
     { 
      throw new InvalidOperationException("The database does not exist. Check your server and connection string."); 
     } 
     if (!context.Database.CompatibleWithModel(true)) 
     { 
      throw new InvalidOperationException("The database is not up to date. You may need to apply update(s)."); 
     } 
    } 
} 
+0

こんにちは、私のwcfサービスが(Visual Studioまたはiisのいずれかによって)再起動されるたびに、initilizationプロセスが呼び出されます。それがなぜなのかを伝える方法はありますか? – daxu

+0

私の編集を参照してください。イニシャライザを変更する必要があります。 –

1

最初のステップは、[ツール]メニューを使用することで、ライブラリパッケージを選択マネージャ]を選択し、[パッケージマネージャコンソール]を選択します。 [パッケージマネージャコンソール]ウィンドウで、次のコマンドを入力します。

Enable-Migrations 

あなたのプロジェクトにマイグレーションという名前のフォルダと、Configuration.csというコードファイルが追加されます。 Configuration.csで

yourprojectname.Modelsを使用して次の行

を入力します。

protected override void Seed(yourprojectname.Models.MyServiceContext context) 
{ 
    context.MyDB.AddOrUpdate(x => x.Id, 
    new MyData() { Name = "Mohit", CreatedDate= "14/05/2016" }, 
    new MyData() { Name = "Prabhat", CreatedDate= "15/05/2016" }, 

    ); 
} 

今すぐパッケージマネージャコンソールウィンドウ

関連する問題