如果我移动 Migrations 文件夹,为什么 EF 6 会忽略应用的迁移?

Why does EF 6 ignore applied migrations if I move the Migrations folder?

当我在我的项目中第一次 运行 Enable-Migrations 时,它在项目根目录下创建了一个 Migrations 文件夹。然后,我将 Migrations 文件夹移动到我的 Data 文件夹下,其中包含上下文和模型等。然后我在两个已经应用的迁移中更正了命名空间。

然后我尝试使用 Add-Migration IdToLong 进行第三次迁移,但我收到一条错误消息:

Unable to generate an explicit migration because the following explicit migrations are pending: [201703061039495_Initial, 201703061159110_ContactRequest]. Apply the pending explicit migrations before attempting to generate a new explicit migration.

我能想到的唯一原因是 EF 存储了连接字符串所在位置的相对路径,而该路径现在已无用。我看到几个报告说 EF 在无法连接到数据库时显示相同的消息。

EF 的这个隐藏 storage/config 违背了我们使用 EF Core 的方向,我真的希望这个问题不会在那里发生。

然后回答我的问题,当我移动 Migrations 以便 EF 不再看到我已经应用了这些迁移时,发生了什么变化或没有发生什么变化?

移动迁移时,您可能(可能)更改了对象的命名空间。此命名空间用作 __MigrationHistory table 中 ContextKey 列的默认值。所以现在当 EF 检查已应用了哪些迁移时,它不会匹配旧的。

如果这是您的问题,您可以通过以下几种方式解决它:

1) 运行 重命名上下文键以匹配您的新命名空间的脚本:

UPDATE [dbo].[__MigrationHistory] 
   SET [ContextKey] = 'New_Namespace.Migrations.Configuration'
 WHERE [ContextKey] = 'Old_Namespace.Migrations.Configuration'

2) 将旧的上下文键硬编码到迁移配置构造函数中:

public Configuration()
{
    AutomaticMigrationsEnabled = false;
    ContextKey = "Old_Namespace.Migrations.Configuration";
}