【问题标题】: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,然后创建一个新的迁移。但是,如果您的应用程序在多个处于不同状态的服务器上运行,那么上述问题仍然存在(您永远不能回滚到比正在使用的最旧迁移更远)

标签: c# entity-framework asp.net-core entity-framework-core


【解决方案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 个迁移时,协议是不一样的:

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

    【讨论】:

      猜你喜欢
      • 2020-06-21
      • 2021-06-27
      • 2021-09-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-28
      • 2019-11-08
      • 2019-02-25
      • 1970-01-01
      相关资源
      最近更新 更多