如何编辑数据库迁移?

Posted

技术标签:

【中文标题】如何编辑数据库迁移?【英文标题】:How do you edit a database migration? 【发布时间】:2020-11-14 17:21:13 【问题描述】:

我重命名了一些表和一些列。当我运行Add-Migration 命令时,迁移会生成删除旧表和列并添加新名称的代码。这会导致它们包含的数据丢失。

因为我不想丢失数据,所以我想编辑迁移,删除 drop 和 add 命令,并用重命名命令替换它们。

但在我编辑迁移后,如何应用该更改?

如果我运行Update-Database 命令,它将应用于数据库。但不是 Entity Framework 维护的我的模式的快照(存储在 ApplicationDbContextModelSnapshot 中)。

我需要一种方法将我的编辑合并到模型中。我怎样才能做到这一点?

【问题讨论】:

您可以编辑迁移文件。 非常好。除了不更新快照。请看我的问题。 为什么需要更改快照? 因为否则,下次我执行Add-Migration 时,它无法识别我的编辑并将架构视为我的更改不存在。它只识别合并到快照中的更改。 当您生成了 drop/create 迁移时,它应该已经创建了具有所需结构的快照,您需要将迁移更改为重命名以适应新的快照。 【参考方案1】:

你没有。

我想您正在使用代码优先方法进行开发,因为问题上有这个标签。

如果您首先使用代码,则必须更改模型并让 Entity Framework 为您更改数据库架构。

推荐阅读:

Migration in Entity Framework Core Entity Framework Core Migrations

【讨论】:

这是一个非常大胆的主张,我认为这不是真的。 我尽可能清楚地解释,它没有正确解释我的更改。所以编辑迁移是获得我需要的结果的唯一方法。 是的,我添加了 code-first 标签,因为我使用的是代码优先。 Code-first 意味着您编辑 code 模型 first。与数据库优先相反。是的,你可以,但你不应该。这可能被认为是一种反模式,一种代码气味。 @JonathanWood 向我们展示您的意图,我们会为您提供帮助。向我们展示您的表格和模型目前的情况以及您想要进行的更改。您不应该尝试破解代码。你将来会给你制造问题。想象一下,当您需要更新 .net 或 ef 版本时。您的代码可能会中断。【参考方案2】:

所以,这绝对是代码中最混乱的部分。

就问题而言,就像GuruStron suggested 一样,我发现进行有效的自定义迁移的唯一方法是对其进行编辑,以使结果与原始生成的迁移产生的结果相同。这使它与数据库快照保持同步。运行Update-Database 将运行您的自定义更新代码。

我认为我最大的问题是我同时进行了太多更改。在为此苦苦挣扎了一段时间后,我取消了一些更改并一点一点地添加回来。如果实体框架能够确定新名称指的是同一列,它将重命名表或列。如果它发现很多变化,它就无法弄清楚这一点。

最后,我不得不为一些被删除的列自定义迁移(将它们自定义为重命名)。但我能够让 Entity Framework 重命名我的表和其他列。

关键:每次进行小的更改,并在将迁移应用到数据库之前仔细检查迁移。如果您需要自定义迁移,请确保最终结果不会改变。

【讨论】:

以上是关于如何编辑数据库迁移?的主要内容,如果未能解决你的问题,请参考以下文章

如何将A数据库的数据迁移到B数据库中

如何将A数据库的数据迁移到B数据库中

EF Core ASP.Net Core 编辑迁移

如何加快核心数据迁移或其他解决方案

如何编辑旧的 Rails 迁移以添加参考?

如何在laravel迁移中编辑原始表?