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

标签 c# entity-framework entity-framework-6 entity-framework-migrations

当我第一次在项目中运行 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 的这种隐藏存储/配置违背了我们使用 EF Core 的方向,我真的希望这个问题不会发生在那里。

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

最佳答案

移动迁移时,您可能(可能)更改了对象的命名空间。此命名空间用作 __MigrationHistory 表中 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";
}

关于c# - 如果我移动 Migrations 文件夹,为什么 EF 6 会忽略应用的迁移?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42646435/

相关文章:

c# - 使用 C# Linq Lambda 将两个对象的字段合并为一个,最好不要使用匿名对象

entity-framework - Entity Framework 4.0 : Why Would One Use the Code Generated EntityObjects Over POCO Objects?

c# - EF Core 迁移不会获取所有属性

c# - Entity Framework : Which Tables Entities are Affected by SaveChanges without Log?

c# - Entity Framework 查询性能慢

c# - 如何使用按钮监听器(基本上)使 C# UI 删除面板控件?

c# - Ajax 脚本管理器阻止了 jquery?

C# LinQ to XML 创建输出

entity-framework - EF6 代码首先复数表无效的对象名称

loops - 循环中的异步和等待多个任务,如何返回单个任务