【发布时间】:2012-06-05 01:29:20
【问题描述】:
我最近更改了一个应用程序,将以下内容用于开发:
DropCreateDatabaseIfModelChanges<Context>
使用方法:
public class MyDbMigrationsConfiguration: DbMigrationsConfiguration<GrsEntities>
{
public MyDbMigrationsConfiguration()
{
AutomaticMigrationsEnabled = true;
AutomaticMigrationDataLossAllowed = true;
}
}
在我的数据库上下文中,我有:
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>());
}
我已经使用 AddOrUpdate 扩展覆盖了 DbMigrationsConfiguration 中的 Seed(context),而之前我只是使用 Add 并在 drop db (DropCreateDatabaseIfModelChanges) 上播种。
我的困惑是,无论 DbContext 是否有任何更改,迁移都会在应用程序的每次启动时运行。每次我启动应用程序(库通过服务运行)时,初始化程序都会像种子一样运行。我的预期行为是检查是否有必要进行迁移(在幕后检查模型是否与物理数据库匹配),然后更新任何新的/删除的表/列,并且只有在发生变化时才运行种子。
在我的测试中,种子每次都运行,这是可行的,但似乎效率低下,并不是我所期望的。不幸的是,MSDN 文档非常有限。
我是否完全滥用了 MigrateDatabaseToLatestVersion?有什么方法可以得到我期望的行为(即只有在模型发生变化时才播种)还是应该只更改我的种子方法以期望在每次应用程序启动时运行?
【问题讨论】:
标签: entity-framework ef-code-first entity-framework-4.3 entity-framework-migrations