在实体框架核心中合并迁移
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 步保存在安全位置的内容中填写上述迁移脚本(即.._InitialCreate
)Up()
和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)