实体框架有时无法识别数据库恢复后的过去迁移

时间:2018-02-19 18:03:30

标签: c# entity-framework

最近,我开始遇到EF的问题。

我会间歇性地复制数据库并将其恢复以进行测试,而EF将无法识别以前的许多迁移。

Get-Migrations将返回已应用迁移的一半左右的列表。如果我检查已恢复数据库中的_MigrationHistory表,我将找到我希望在表中看到的每个迁移。

如果我尝试执行Update-Database,EF将尝试从Get-Migrations离开的位置开始应用所有迁移,直到应用上次迁移为止。因为所有这些迁移都已经实际应用;这失败了,因为迁移不再与DB的当前方案相匹配。

发生了什么?有谁之前经历过这个吗?如何使EF识别所有其他应用的迁移?删除所有过去的迁移并创建新的初始迁移不是一个选项。我需要尝试修复EF的状态。

注意:这并不总是会发生,它似乎是在数据库恢复后间歇性发生的。有时删除已恢复的数据库并再次尝试修复它。这在生产中还没有发生,但我担心它会。

我已尝试在这个问题上进行一些谷歌搜索,但我似乎发现所有人都在询问如何迁移或如何重置迁移。我正在寻找一种方法来修复EF的状态,以便识别_MigrationHistory中找到的所有迁移。谢谢你的时间!

1 个答案:

答案 0 :(得分:1)

所以...最终这是用户错误,但问题很奇怪,所以我将回答我自己的问题,以帮助其他人。短篇小说:相信EF做正确的事。你可能搞砸了什么。

基本上我发现的是我没有连接到我认为我连接的数据库。我的连接字符串中有一个拼写错误,这导致EF创建一个新的数据库并部分执行我们所有古老的,4年前的迁移。它将部分失败,因为其中一个旧迁移引用的文件不再是解决方案的一部分。

事件顺序:

  1. 已打开Sql Studio Management Studio(SSMS)
  2. 运行TSQL脚本以使用新名称复制数据库
    • (注意:目前,我的SSMS中有2个数据库,原始和副本)
  3. 将项目中的连接字符串更改为新数据库
    • (注意:这是我在连接字符串中引入拼写错误的地方)
  4. 跑过程序 - 开始获取“模型已更改,请运行update-database”错误消息。
  5. Ran get-migrations -verbose,它只返回了一些应用的迁移,并且它输出的连接字符串看起来对我来说。
  6. 检查了SSMS中的新数据库,发现数据已满,并且已应用所有迁移
    • (注意:SSMS仍然只显示2个Dbs)
  7. 就在这个时候,我来到这里并开始发帖。 @SteveGreene建议我尝试生成SQL脚本...我做了并将其复制到新数据库的SSMS中,发现它能够找到最新的迁移...但这与get-migrations的方式无关行为。

    这是我刷新SSMS对象资源管理器的时候。就在第三个数据库突然出现的时候,我发现它是在我在连接字符串中引入拼写错误时创建的。该项目配置为自动运行迁移,因此这导致创建第3个数据库并执行所有旧迁移...其中一个引用了不再存在于解决方案中的文件并且失败。我检查了第三个数据库,它没有数据,只应用了一些迁移。

    我所要做的就是删除额外的数据库并修复连接字符串中的拼写错误... facepalm