在实体框架核心中合并迁移

Posted

技术标签:

【中文标题】在实体框架核心中合并迁移【英文标题】:Merge migrations in entity-framework-core 【发布时间】:2017-04-06 01:34:58 【问题描述】:

是否可以将所有迁移文件合并为一个?

我创建了初始迁移。

dotnet ef migrations add InitialMigration

Source

每当我有一些模型更改时,我都会创建新的迁移更新。

但是现在我的迁移更新文件太多了。 是否可以将所有迁移文件合并为一个?

当然删除数据库不是一个选项,我必须保留数据!

【问题讨论】:

毫无意义,您的数据库可能处于 ANY 的迁移状态。即,如果您有 6 次迁移并且您的数据库处于迁移 4,但是如果您将 3 到 6 合并到一个迁移文件中,您将永远无法升级第 4 次迁移的数据库 你能做的最好的事情是,如果你有 15 个迁移,回滚到迁移 2,然后创建一个新的迁移。但是,如果您的应用程序在多个处于不同状态的服务器上运行,那么上述问题仍然存在(您永远不能回滚到比正在使用的最旧迁移更远) 【参考方案1】:

EF 6.X 有一个选项IgnoreChanges。这非常适合您的场景。但不幸的是,它不是 EF 核心中可用的功能。

但是有一个解决方法。

第 1 步:删除 Migrations 文件夹中的所有迁移脚本。

第 2 步:在包管理器控制台中:运行

PM> Add-Migration InitialCreate

第 3 步: 删除 Up()Down() 方法代码。在执行此操作之前,请将这些方法保存在其他位置,因为我们将在第 5 步中再次需要它们。

第四步:运行:

 PM> Update-Database

它会在__EFMigrationsHistory 表中插入一条新记录。

第 5 步: 之后,从 第 3 步保存在安全位置的内容中填写上述迁移脚本(即.._InitialCreateUp()Down() 方法强>。

就是这样。现在您只有 1 个迁移文件 :)

注意:带有包管理器控制台(PM)的EF核心:Package Manager Console

【讨论】:

我只是不确定是否可以从包管理器控制台在 entity-framework-core 中运行迁移。我不能。我必须从命令提示符处完成此操作。 这不是一个好的解决方案。它必须明确指出这是一个坏主意,并且在将其应用于生产环境之前,应谨慎用于测试环境。 我使用的最佳解决方案是首先在数据库中工作(使用 edmx 和/或数据库项目)。我不明白为什么微软删除了这个选项。更高效(您可以真正微调数据库的性能),部署到新服务器时的问题更少(只需将数据库项目发布到 SQL 服务器或在 2 秒内生成脚本即可),EDMX 模型保留您的代码模型和数据库同步,... 这种方法似乎丢失了在Up()Down() 中使用的migrationBuilder.Sql() 等原始SQL 语句【参考方案2】:

一种方法是物理删除所有迁移文件并添加新文件。如果您的迁移在“Migrations”文件夹中,您可以简单地删除它,否则您还需要删除您的“ModelSnapshot”文件。我认为这种方法可以解决您的问题。

【讨论】:

【参考方案3】:

当你想合并不是所有但最后 N 个迁移时,协议是不一样的:

    还原最后 N 个迁移,一个一个,每个迁移都使用以下 2 个命令: dotnet ef database update NameOfTheLastMigration dotnet ef migrations remove 将还原应用到数据库: dotnet ef database update 创建“合并”迁移: dotnet ef migrations add NameOfTheMergeMigration

【讨论】:

以上是关于在实体框架核心中合并迁移的主要内容,如果未能解决你的问题,请参考以下文章

在不使用其他项目的情况下添加实体框架核心迁移

如何使用 .net 核心实体框架迁移更新表(而不是重新创建它们)

text 实体框架核心和sqlite:数据库迁移(使用VS2017 macOS)

在快速自定义的NopCommerce中使用实体框架(EF)代码优先迁移

核心数据迁移删除实体数据

迁移复杂的核心数据模型