最近、アプリケーションをdevに使用するものから変更しました。
DropCreateDatabaseIfModelChanges<Context>
使用するには:
public class MyDbMigrationsConfiguration: DbMigrationsConfiguration<GrsEntities>
{
public MyDbMigrationsConfiguration()
{
AutomaticMigrationsEnabled = true;
AutomaticMigrationDataLossAllowed = true;
}
}
私のdbコンテキストでは、次のようになります。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// Tell Code First to ignore PluralizingTableName convention
// If you keep this convention then the generated tables will have pluralized names.
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
//set the initializer to migration
Database.SetInitializer(new MigrateDatabaseToLatestVersion<GrsEntities, MigrationConfig>());
}
ドロップデータベース(DropCreateDatabaseIfModelChanges)にシードを設定して、前にAddを使用していたAddOrUpdate拡張機能を使用して、DbMigrationsConfigurationのSeed(context)をオーバーライドしました。
私の混乱は、DbContextに変更があったかどうかに関係なく、アプリケーションの起動ごとに移行が実行されることです。アプリケーションを起動するたびに(ライブラリはサービスを介して実行されます)、初期化子はシードと同様に実行されます。私の予想される動作は、移行が必要かどうかをチェックし(モデルが物理データベースと一致するかどうかを舞台裏でチェックします)、新しい/削除されたテーブル/列を更新し、何かが変更された場合にのみシードを実行します。
私のテストでは、シードは毎回実行されます。これは実行可能ですが、一見非効率的であり、私が期待したものではありませんでした。残念ながら、MSDNのドキュメントは非常に限られています。
MigrateDatabaseToLatestVersionを完全に誤用していますか?期待する動作(つまり、モデルが変更された場合にのみシード)を取得する方法はありますか、それとも、アプリケーションの起動ごとに実行されることを期待するようにシードメソッドを変更する必要がありますか?