我遇到问题的情况如下:
当我在这个新数据库上检查__MigrationHistory表时,它只包含'InitialCreate'条目,这样就可以解释为什么其他两个迁移被认为是挂起的。但我无法看到它们如何在未应用的情况下进入此表,同时它们并不真正需要应用,因为数据库已经包含它们所涵盖的任何更改。 我错过了什么?
我只想补充一点,似乎有点怀疑'InitialCreate'中的Model列与'NewPropertyMigration'中的Model列不同,即使它们代表相同的模型。这可能是原因吗?
更新: 这是我用来创建新数据库并同时自动应用任何迁移的代码
public class MigratePaymentsToLatestVersion<TContext> : IDatabaseInitializer<TContext> where TContext : DbContext
{
public void InitializeDatabase(TContext context)
{
// Create a brand new database if it doesn't exist but still apply any pending migrations
context.Database.CreateIfNotExists();
var migrator = new DbMigrator(configuration);
migrator.Update();
}
}
更新2:显示相同问题的更简单方案
在进一步研究这个问题时,我已经能够在下面描述的更简单的场景中重现这种行为:
答案 0 :(得分:2)
我现在已整理好了。我失踪的关键点似乎与你从4.1移动到4.3的方式有关。我一直在关注ef-4-3-migrations-and-existing-database的步骤。似乎更有效的是SO问题how-to-use-migrations-on-an-existing-db中描述的程序。 如果你比较它们,你会看到一个人在你第一次迁移时依赖-IgnoreChanges(称为'InitialMigration'),而另一个创建一个完整的'InitialCreate'迁移,其中包含你在那个时间点的整个模型。后一种方法的两个重要后果是: - 创建全新数据库时InitialCreate迁移(包含模型的完整定义)用于创建数据库而不是“其他代码”(不确切但是猜测这是未启用迁移时所需的部分)根据模型生成数据库 - 使用最新模型创建新数据库,并在__MigrationHistory中列出所有迁移
因此,使用InitialCreate方法,我可以将迁移应用于现有数据库(对于他们而言,只是跳过了InitialCreate,因为历史记录中的条目是作为程序的一部分手动添加的),同时我能够创建品牌新数据库并向其添加新迁移,而不会出现模型和数据库不同步的错误。
我希望能帮助像我一样遵循第一道程序的人。