【发布时间】: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