将 EF Core 迁移添加到现有数据库,同时仍允许从头开始创建数据库
Posted
技术标签:
【中文标题】将 EF Core 迁移添加到现有数据库,同时仍允许从头开始创建数据库【英文标题】:Adding EF Core Migrations to an existing database, while still enabling creation of the database from scratch 【发布时间】:2021-12-29 17:00:53 【问题描述】:去年,我用 .Net Core 和 EF Core 重写了一个遗留应用程序,但由于其他限制因素,当时我选择不添加迁移。终于到了新应用程序可以作为架构更改的“单一事实来源”运行的时候了,但我对前进的最佳方式有点茫然。
我的最终目标是进行可以从零开始构建整个现有数据库的迁移(减去非查找表中包含的数据)。不幸的是,到目前为止,我提出的最可行的解决方案是针对一个新的空白数据库构建我的迁移。然后,一旦创建了与当前数据库状态匹配的初始迁移,我就可以将 __EFMigrationsHistory
从新创建的数据库复制到旧数据库。
或者,我可以搭建一个空白的初始迁移,如果它不存在,我可以尝试在该迁移中添加逻辑以从 SQL 文件创建数据库。
这两种解决方案似乎都不是特别“好”。除了FluentMigrator
之类的工具之外,是否有任何以 EF Core 为中心的方法可以简化为现有数据库创建迁移, 需要重新创建以进行测试?
【问题讨论】:
【参考方案1】:当我想压缩过去 5 年的所有现有迁移时,我遇到了类似的问题(因为创建新实例需要很长时间)。我是这样做的:
-
从您的代码中删除所有迁移,包括任何
DbContextModelSnapshot.cs
支架初始迁移:它将包含创建新数据库实例的所有内容
支架另一个迁移,专门用于播种初始数据(如果您不需要在新创建的实例上播种数据,这是可选的)。目标是将种子与 SQL 结构隔离开来。
提交您的更改
保留迁移,但删除 Up
和 Down
方法的主体;目标是诱使 EF Core 认为它应用了这些迁移
使用这些空迁移更新您现有的实例:什么都不会做,但__EFMigrationsHistory
表将包含它们并在将来忽略它们
还原您的更改,以恢复迁移的主体
通过所有这些步骤,您现在可以使用未来的任何迁移更新现有实例,还可以从头开始重新创建新实例。
【讨论】:
以上是关于将 EF Core 迁移添加到现有数据库,同时仍允许从头开始创建数据库的主要内容,如果未能解决你的问题,请参考以下文章
asp.net core 使用EF7 Code First 创建数据库,同时使用命令创建数据库(本来想数据迁移 没有成功,只能将标题搞成这个。)
要在 EF Core 中添加没有外键的导航属性,使用 .NET Core Web API 进行 DB-first 迁移