首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用EF核恢复迁移历史

问如何用EF核恢复迁移历史
EN

Stack Overflow用户
提问于 2020-06-05 17:10:40
回答 1查看 1.6K关注 0票数 2

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

代码语言:javascript
复制
MigrationId                         ProductVersion
20200516181941_InitialMigration     3.1.4
20200517091058_AddedIndexes         3.1.4
20200605115456_IntroducedBreweries  3.1.4

现在让我们假设,由于某种原因,我失去了所有的表(或者仅仅是其中的一部分)。所以突然间桌子看起来像这样:

代码语言:javascript
复制
MigrationId                         ProductVersion
20200517091058_AddedIndexes         3.1.4
20200605115456_IntroducedBreweries  3.1.4

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

代码语言:javascript
复制
Add-Migration SomethingChanged

这会很好,因为我们现在不和数据库交谈。但是如果我试图更新数据库,像这样

代码语言:javascript
复制
Update-Database

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

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

代码语言:javascript
复制
Script-Migration 20200517091058_AddedIndexes 20200605115456_IntroducedBreweries

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

有什么(生产安全)方法来解决这个问题,这样迁移历史就不会永远中断吗?

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

EN

回答 1

Stack Overflow用户

发布于 2020-06-05 17:25:47

问题是:您已经破坏了迁移,并且希望在不删除现有表的情况下重新设置迁移。

问题是:不能用数据库中的现有表重置迁移,因为EF希望从头创建表。

该做什么:

  1. 从Migrations_History表中删除现有迁移。
  2. 从migrations文件夹中删除现有迁移。
  3. 运行添加-迁移重置。这将在您的迁移文件夹中创建一个迁移,其中包括创建表(但它不会运行,因此不会出错)。
  4. 现在,您需要在MigrationHistory表中创建初始行,以便EF具有当前状态的快照。如果应用迁移,EF将执行此操作。但是,您不能应用您刚刚完成的迁移,因为数据库中已经存在这些表。因此,进入迁移并注释掉"Up“方法中的所有代码。
  5. 现在运行更新数据库。它将应用迁移(而不是实际更改数据库),并在MigrationHistory中创建快照行。

您现在已经重置您的迁移,并可能继续正常迁移。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62220711

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档