【问题标题】:EF Core proper way to delete uncommitted migrationEF Core 删除未提交迁移的正确方法
【发布时间】:2021-04-14 17:21:21
【问题描述】:

环境:.NET Core 3.1 和 EF Core

简短的故事:进行了两次迁移(A 和 B)。 B 基于 A。但 update-database 尚未针对 A 和 B 执行。A 已删除。有没有办法恢复 A 和 B?

长话短说:我认为我做了一些愚蠢的事情。我在代码中添加了一个类,然后做了add-migration(假设是迁移A)。检查生成的迁移类后,我回去进行一些更改。因为我还没有运行update-database,所以我删除了迁移A,然后又运行了一个add-migration,得到了迁移B。然后我发现B是基于A的。删除迁移A并不会清除迁移。

进一步研究我发现迁移,甚至没有更新到数据库,都保存在MyDBContextModelSnapshot.cs 文件中。这就是EF跟踪它的方式吗?我现在无法运行 update-database,因为缺少迁移 A。应用迁移 B 只会导致数据库出错。

我的问题是,与其进入 MyDBContextModelSnapshot.cs 并手动将其恢复到迁移 A 之前并重做迁移,有没有办法解决这个问题?

谢谢。

【问题讨论】:

  • 从您的数据库中删除迁移历史记录(用于迁移 A)。然后,删除迁移 B 并再次创建它以确保没问题。如果迁移 A 影响了您的表,您需要手动“撤消”
  • 一般来说你应该使用Remove-Migration命令而不是手动删除迁移文件。在 EF6 中已经使用了手动文件删除,但 EF Core 系统非常不同。您可以尝试该命令以查看它是否会删除 B 并恢复状态。很可能没有(它会有来自A 的数据),但您可以手动编辑快照。
  • 您是如何删除迁移的,只是删除了文件?你试过dotnet ef database remove B然后dotnet ef database remove A吗?它应该使用快照而不需要查看文件。
  • 你不能只从回收站中恢复文件,然后运行两次“Remove-Migration”进行 A&B 迁移。由于它们未应用于数据库,因此删除它们应该没有任何问题。

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


【解决方案1】:

问题确实出在快照文件中,您需要将其恢复到添加 A 之前的状态。然后您可以添加 B,它将创建以前在 A 中的所有新更改。即使没有迁移文件,这也应该可以解决问题:

 dotnet ef database migrations remove B 
 dotnet ef database migrations remove A
 dotnet ef database migrations add B

如果它抛出错误并且你有源代码控制,这也应该是一个快速恢复,如果没有,你应该设置源代码控制来防止这种类型的事情。尽早并经常提交对于单个开发人员和团队来说都是一种很好的做法,而且它使消除错误变得微不足道。

最后,如果命令不起作用并且您没有较早的副本,则可以使用以前的迁移。如果在添加 A 之前有迁移 Z,则可以将 Z.Designer.cs 的内容复制到快照中(不要更改类名或导入)。迁移设计器是 EF 跟踪更改的方式,并在添加迁移时将其应用于快照。这与手动还原快照相同,但出错的可能性较小。

【讨论】:

    【解决方案2】:

    经过一番研究,我只是简单地执行了这个命令来删除A和B,即使A的迁移文件已经被删除(我在回收站中没有找到它)。

    Remove-Migration 
    

    然后通过使用“add-migration” ef core 创建正确的迁移脚本。

    谢谢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-09
      • 1970-01-01
      • 2020-11-12
      • 2021-11-23
      • 2018-11-29
      • 2020-01-25
      • 1970-01-01
      • 2022-11-11
      相关资源
      最近更新 更多