最近,我开始遇到 EF 问题。
间歇性地,我会复制一个数据库并将其恢复以进行测试,并且 EF 将无法识别以前的许多迁移。
Get-Migrations
将返回大约一半已应用迁移的列表。如果我检查恢复的数据库中的 _MigrationHistory
表,我将找到我期望在表中看到的每个迁移。
如果我尝试执行 Update-Database
,EF 将尝试从 Get-Migrations
停止的位置开始应用所有迁移,直到应用最后一次迁移。因为所有这些迁移都已经实际应用了;这会失败,因为迁移不再与数据库的当前方案匹配。
发生什么事了?有谁之前经历过这个吗?我该怎么做才能使 EF 识别所有其他应用的迁移?删除所有过去的迁移并创建新的初始迁移不是一种选择。我需要尝试修复 EF 的状态。
注意:这种情况并不总是发生,它似乎在数据库恢复后间歇性地发生。有时删除恢复的数据库并再次尝试修复它。这在生产中还没有发生,但我担心它会发生。
我尝试在这个问题上进行一些谷歌搜索,但我似乎发现人们都在询问如何迁移或如何重置迁移。我正在寻找一种方法来修复 EF 的状态,以便它能够识别 _MigrationHistory
中找到的所有迁移。谢谢你的时间!
最佳答案
所以...最终这是用户错误,但问题很奇怪,所以我会回答我自己的问题以在将来帮助其他人。简短故事:相信 EF 会做正确的事。你可能搞砸了一些事情。
基本上我发现我没有连接到我认为我正在连接的数据库。我的连接字符串中有一个拼写错误,这导致 EF 创建一个新的数据库并部分执行我们所有古老的 4 年前的迁移。它会中途失败,因为这些旧迁移之一引用的文件不再是解决方案的一部分。
事件顺序:
- 打开Sql Studio Management Studio (SSMS)
- 运行 TSQL 脚本以使用新名称复制数据库
- (注意:此时,我的 SSMS 中有 2 个数据库,原始数据库和副本)
- 将我的项目中的连接字符串更改为新数据库
- (注意:这是我在连接字符串中引入拼写错误的地方)
- 运行程序 - 开始收到“模型已更改,请运行更新数据库”错误消息。
- 冉
get-migrations -verbose
,它只返回一些已应用的迁移以及它输出的连接字符串看起来对我来说是正确的。 - 检查 SSMS 中的新数据库,发现其中充满了数据,并且已应用所有迁移
- (注意:SSMS 仍然只显示 2 Db)
大约在这个时候,我来到这里并开始发帖。 @SteveGreene 建议我尝试生成 SQL 脚本...我这样做并将其复制到新数据库上的 SSMS 中,发现它能够找到最新的迁移...但这与 get-migrations
的方式无关。表现得很好。
这是我刷新 SSMS 对象资源管理器的时候。就在那时,第三个数据库突然出现,我发现它是在我的连接字符串中引入拼写错误时创建的。该项目配置为自动运行迁移,因此这导致创建第三个数据库并执行所有旧迁移...其中一个引用了一个不再位于解决方案中的文件并失败了。我检查了第三个数据库,它没有数据,只应用了一些迁移。
关于c# - 数据库恢复后, Entity Framework 有时无法识别过去的迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48871817/