去年,我用.Net Core和EF Core重写了一个遗留应用程序,但由于其他限制因素,我当时选择不添加迁移。终于到了新应用程序可以作为";真理的单一来源";对于模式更改,但对于前进的最佳方式,我有点不知所措。
我的最终目标是进行迁移,使整个现有数据库从无到有(减去非查找表中包含的数据(。不幸的是,到目前为止,我提出的最可行的解决方案是针对一个新的空白数据库构建迁移。然后,一旦创建了与当前数据库状态匹配的初始迁移,我就可以通过__EFMigrationsHistory
从新创建的数据库复制到旧数据库。
或者,我可以构建一个空白的初始迁移,如果不存在SQL文件,我可以尝试在该迁移中添加逻辑,以从该文件创建数据库。
两种解决方案似乎都不是特别";好";。除了像FluentMigrator
这样的工具之外,是否有任何以EF Core为中心的方法可以简化为现有数据库创建迁移,将需要重新创建以进行测试?
当我想压缩过去5年中所有现有的迁移时,我也遇到了类似的问题(因为创建一个新实例需要很长时间(。我是这样做的:
- 从代码中删除所有迁移,包括任何
DbContextModelSnapshot.cs
- 为初始迁移搭建脚手架:它将包含创建新DB实例的所有内容
- 脚手架另一个迁移,专门为初始数据播种(如果您不需要在新创建的实例上播种数据,这是可选的(。目标是将种子与SQL结构隔离开来
- 提交您的更改
- 保留迁移,但删除
Up
和Down
方法的主体;目标是诱使EF Core认为它应用了这些迁移 - 使用这些空迁移更新现有实例:不会执行任何操作,但
__EFMigrationsHistory
表将包含它们,并在将来忽略它们 - 恢复您的更改,以恢复迁移的主体
通过所有这些步骤,您现在可以使用任何未来的迁移更新现有实例,还可以从头开始重新创建新实例。