如何使用 EF Core 还原迁移历史记录



假设我有一个由三次迁移创建的数据库。它们可以在表格中看到dbo._EFMigrationsHistory内容可能如下所示:

MigrationId                         ProductVersion
20200516181941_InitialMigration     3.1.4
20200517091058_AddedIndexes         3.1.4
20200605115456_IntroducedBreweries  3.1.4

现在假设我由于某种原因丢失了所有表(或只是其中的一部分(。突然间,表格看起来像这样:

MigrationId                         ProductVersion
20200517091058_AddedIndexes         3.1.4
20200605115456_IntroducedBreweries  3.1.4

然后我进行了新的迁移,因为我更改了数据库中的某些内容

Add-Migration SomethingChanged

这将正常工作,因为我们此时没有与数据库交谈。但是如果我尝试像这样更新数据库

Update-Database

它会失败,因为它试图重新运行InitialMigration(或者至少我认为是这样(。因此,一个常见的错误是无法创建在 InitialMigration 中创建的表,因为它们已经存在。

在开发过程中,您可以简单地对数据库和/或迁移进行核弹,但这对于生产来说不是一个非常可行的策略。也可以使用Script-Migration来完成,它有一个 from/to 选项,允许这样的事情:

Script-Migration 20200517091058_AddedIndexes 20200605115456_IntroducedBreweries

但这似乎不适用于Update-Database(在文档中也没有(。

是否有任何(生产安全(方法来解决此问题,以便迁移历史记录不会永远中断?

我能想到的最好的方法是在数据库中手动插入丢失的行,但这似乎很黑客......

问题:您已经搞砸了迁移,并且希望在不删除现有表的情况下重置它。

问题:无法重置数据库中现有表的迁移,因为 EF 想要从头开始创建表。

怎么办:

  1. 从表中删除现有迁移Migrations_History。
  2. 从迁移文件夹中删除现有迁移。
  3. 运行添加迁移重置。这将在 包含创建表的迁移文件夹(但不会 运行它,这样它就不会出错。
  4. 现在,您需要在"迁移历史记录"表中创建初始行 因此,EF 具有当前状态的快照。EF 将执行此操作,如果您 应用迁移。但是,您无法应用您 只是因为表中已经存在于您的数据库中。所以进入 迁移并注释掉"Up"方法中的所有代码。
  5. 现在运行更新数据库。它将应用迁移(虽然不是 实际更改数据库(并在 迁移历史记录。

您现在已重置迁移,可以继续正常迁移。

最新更新