最近,我开始遇到EF的问题。
我会间歇性地复制数据库并将其恢复以进行测试,而EF将无法识别以前的许多迁移。
Get-Migrations
将返回已应用迁移的一半左右的列表。如果我检查已恢复数据库中的_MigrationHistory
表,我将找到我希望在表中看到的每个迁移。
如果我尝试执行Update-Database
,EF将尝试从Get-Migrations
离开的位置开始应用所有迁移,直到应用上次迁移为止。因为所有这些迁移都已经实际应用;这失败了,因为迁移不再与DB的当前方案相匹配。
发生了什么?有谁之前经历过这个吗?如何使EF识别所有其他应用的迁移?删除所有过去的迁移并创建新的初始迁移不是一个选项。我需要尝试修复EF的状态。
注意:这并不总是会发生,它似乎是在数据库恢复后间歇性发生的。有时删除已恢复的数据库并再次尝试修复它。这在生产中还没有发生,但我担心它会。
我已尝试在这个问题上进行一些谷歌搜索,但我似乎发现所有人都在询问如何迁移或如何重置迁移。我正在寻找一种方法来修复EF的状态,以便识别_MigrationHistory
中找到的所有迁移。谢谢你的时间!
答案 0 :(得分:1)
所以...最终这是用户错误,但问题很奇怪,所以我将回答我自己的问题,以帮助其他人。短篇小说:相信EF做正确的事。你可能搞砸了什么。
基本上我发现的是我没有连接到我认为我连接的数据库。我的连接字符串中有一个拼写错误,这导致EF创建一个新的数据库并部分执行我们所有古老的,4年前的迁移。它将部分失败,因为其中一个旧迁移引用的文件不再是解决方案的一部分。
事件顺序:
get-migrations -verbose
,它只返回了一些应用的迁移,并且它输出的连接字符串看起来对我来说。 就在这个时候,我来到这里并开始发帖。 @SteveGreene建议我尝试生成SQL脚本...我做了并将其复制到新数据库的SSMS中,发现它能够找到最新的迁移...但这与get-migrations
的方式无关行为。
这是我刷新SSMS对象资源管理器的时候。就在第三个数据库突然出现的时候,我发现它是在我在连接字符串中引入拼写错误时创建的。该项目配置为自动运行迁移,因此这导致创建第3个数据库并执行所有旧迁移...其中一个引用了不再存在于解决方案中的文件并且失败。我检查了第三个数据库,它没有数据,只应用了一些迁移。