我一直在使用EF迁移已有一段时间了,并且在我的项目中有超过100个迁移文件。我希望在继续之前将这些整合到一个迁移中 - 即我想用一个新版本替换现有的InitialCreate迁移,该版本将我的所有后续更改都考虑在内,这样我就可以删除所有其他迁移文件。
如果我不关心丢失数据库中的所有数据,我很容易这样做,但我是。
如何通过运行Update-Database(我认为使用the approach outlined by Julie Lerman无法实现)来保持所有数据的完整性并保留从头开始重新创建数据库(无数据)的能力?< / p>
答案 0 :(得分:16)
请阅读Rick Strahl的这篇精彩文章: https://weblog.west-wind.com/posts/2016/jan/13/resetting-entity-framework-migrations-to-a-clean-slate
基本上,解决方案并不简单,只需将所有迁移重置为一个即可 因为您有两个场景需要适合一个迁移类:
解决方案: 这个过程的想法基本上是这样的:数据库和EF模式是最新的,只是你想要的方式,所以我们将删除现有的迁移并创建一个新的初始迁移。
总之,执行此操作的步骤如下:
答案 1 :(得分:10)
如果您不关心保留此迁移,我所做的就是删除迁移文件夹中的所有内容,然后在连接字符串中定位新数据库(或传入新数据库)。之后,您可以运行add-migration命令:
add-migration InitialCreate
它应该为你创建迁移。
答案 2 :(得分:2)
下面的过程的好处是无需对数据库做任何事情,__ MigrationHistory可以保持原样。如果您具有多个具有不同版本结构的环境,那么它也将起作用-只要您具有匹配的分支。
我将最后一次迁移转换为初始迁移。诀窍是使用所使用的代码和数据库的最旧版本,用新的初始迁移替换其最后的迁移,并删除所有先前的迁移。较新的分支机构保留较新的迁移,因此在合并到较旧的分支机构后这些分支仍将起作用。
因此从OLDEST分支开始-通常是PROD,然后执行以下操作:
仅当您不向EF本身不会做的迁移添加内容时,以上注释才有效。例如。如果您添加数据库视图等,那么新创建的迁移将无法获得这些视图,则只能获得EF根据您的代码生成的脚本。
答案 3 :(得分:1)
删除所有迁移或重新生成它们有缺点,因此我们采用了合并所有旧迁移的方法。
它需要一些脚本。您在此处阅读详细信息 https://www.bokio.se/engineering-blog/how-to-squash-ef-core-migrations/ 并在此处查看脚本 https://github.com/bokio/EFCoreTools/tree/main/MigrationSquasher
基本步骤如下(复制自博文):
我们的方法概述
我希望这对其他人有帮助。 EF 团队正在考虑改进这个故事,因此如果您对自己的需求有反馈意见,可能会帮助他们立即发布https://github.com/dotnet/efcore/issues/2174。
答案 4 :(得分:0)
我们遇到了同样的问题。 我们找到的一般解决方案是
这个方案比较简单。它解决所有情况
请注意,如果您在 v1 迁移中使用了自定义脚本/sql(...),则必须检查 v2 Init 迁移是否需要它。
为了确保没有问题,我们从 v1 迁移创建了一个空数据库,并从 v2 init 迁移创建了另一个数据库,并进行了架构和数据差异(使用 Visual Studio SQL Server 工具)