如何完全删除添加新 table 的 EF 迁移

How to delete EF migration that adds a new table completely

我正在尝试删除迁移,但这会导致出现一些奇怪的情况。

要创建此迁移,我:

  1. 已创建 class,代表数据库中的 table
  2. 将其添加到我的 DbContext
  3. 迁移的脚手架

作为新 table 创建的结果,一切都按预期进行。直到我决定我不再需要那个 table(但那时我已经创建了一些其他迁移 - 所以我试图删除的迁移不是最后一个)所以我:

  1. 恢复到我要删除的那个迁移之前的一个迁移
  2. 已删除迁移
  3. 已从 DbContext 中删除
  4. 删除了那个class(彻底粉碎并清空了一个回收站)
  5. 更新了我的数据库

我得到了一个错误:Unable to update database to match the current model because there are pending changes and automatic migration is disabled.为了查明到底是什么未决,我尝试添加新的迁移,而新的迁移在它的 Up 方法中删除了 table不再存在并在 Down 方法中创建 table(与原始迁移所做的完全相反)。

我什至尝试删除我的数据库并从头开始生成它,但没有成功 - 进入相同的状态。

我尝试试验发现的奇怪行为:

  1. 当我将 class 添加回去并将其添加到 DbContext 时,我没有收到任何错误,但在数据库
  2. 中没有 table
  3. 当我恢复新的迁移(在 Down 中创建一个新的 table)时 - 没有任何反应 - table 未创建

那么我怎样才能完全摆脱 class 和迁移呢?

这里有两种选择。

首先是添加一个额外的迁移来删除 table。这是最简单的并且可能是 "best practice" 路线(特别是如果迁移已经在生产中)。唯一的缺点是您将进行 2 次迁移,这些迁移仅用于相互抵消。但这不一定是坏事。为此:

  1. 确保数据库更新为当前模型(包括table)
  2. 删除实体class
  3. 在您的 DbContext 中删除对它的引用。
  4. 生成新迁移。新迁移应该只删除 table.
  5. 更新数据库。

如果您出于某种原因想要限制迁移数量,您需要执行以下操作:

  1. 删除数据库
  2. 删除您要删除的迁移及其后的所有迁移
  3. 移除实体class
  4. 从 DbContext 中删除
  5. 更新数据库(您会收到一条警告,指出数据库与模型不匹配,但这没关系。)
  6. 添加迁移
  7. 更新数据库

编码愉快。