添加新迁移时,EF Data迁移无法检测到更改

时间:2013-04-03 08:05:08

标签: entity-framework ef-migrations

我首先使用Entity Framework 5.0数据迁移和代码。 当我向模型添加新字段并在包管理器控制台中执行以下命令时。

 "Add-migration AddedField"

我得到的是一个名为“n_AddedField”的空迁移,up和down方法不包含逻辑。

我尝试了很多东西,重新安装EF nuget包,清理我的解决方案,重建,手动删除所有生成的文件和目录。

然后我决定废弃我的所有迁移并重新开始,然后它变得奇怪。 删除所有迁移和数据库中的迁移历史表后,我使用CreateDatabaseIfNotExists初始化程序重新创建了数据库。完成此操作后,我应该能够创建一个新的初始迁移。但是,当我尝试创建新的迁移时,我收到一条错误消息,指出存在待定迁移,并列出了我刚从项目中删除的所有迁移。

我不知道EF为何以及如何回忆这些迁移。 我甚至尝试搜索文件内容,查看迁移是否保存在其他地方或其他地方。但没什么......

当scott hansleman演示在舞台上时,数据迁移看起来非常整洁,但对于实际工作,我开始寻找替代方案。

当项目启动时,我们使用的是EF 4.x并且稍后将其切换到5.0,但是由于交换机我成功添加了一堆迁移。

有谁知道如何解决这个问题? 基本上我只是希望能够添加迁移,并生成带有更改的sql脚本。

17 个答案:

答案 0 :(得分:33)

我遇到了一个类似的问题,即没有找到新的迁移,所以update-database无论我做了什么都给了我以下错误:

Unable to update database to match the current model because there are pending changes and automatic migration is disabled. Either write the pending model changes to a code-based migration or enable automatic migration. Set DbMigrationsConfiguration.AutomaticMigrationsEnabled to true to enable automatic migration.
You can use the Add-Migration command to write the pending model changes to a code-based migration.

进行"批量清洁"解决了我的问题,建议EF使用来自当前所选解决方案配置以外的文件夹中的旧/无效程序集(例如DEBUG)'。

进行批量清理:

  1. 选择Main Menu -> Build -> Batch Build...
  2. 点击Select All
  3. 点击Clean
  4. 关闭对话框,重建并重新尝试迁移。

    希望这有助于其他人。

答案 1 :(得分:21)

糟糕。在我的情况下,我添加了一个未被任何其他实体引用的新根实体。结果只是代码首先没有理由为实体生成迁移。一旦我将代码添加到DbContext(一个dbset)中,它就像一个魅力。

答案 2 :(得分:7)

刚刚遇到同样的问题,但发现我的新字段是作为成员变量而不是属性添加的 - 它错过了{get; set;} part,这使得迁移跳过该字段。

可能不是你的情况,但可能有助于其他人。

答案 3 :(得分:6)

你'不同步' - Db,迁移,代码 - 你可以期待各种各样的问题。

我这样做了million times(差不多:)而且效果很好 - 但是你需要保持稳定,并且要细心处理你正在做的事情。

你可以通读我所做的'总结' - 在某个地方中途开始(但也检查连接)。

Code first create tables

......如果它不起作用,我建议你制作一个小的'可重复'场景/模型 - 准确发布你的内容。

迁移的工作原理:

迁移与“迁移表”相关联。

当运行Add-Migration时 - 它会检查“现有数据库”结构和迁移表 - 并使“差异”(有时候你没有'向上''向下',因为它们也是同步的)。

因此,每次“迁移”都是代码,现有迁移,数据库和迁移表之间的复杂差异。除了删除数据库之外没有其他任何东西肯定会重置 - Db'迁移'表可能还不够 - 这并不能保证完全'清理'(如果可能的话,我总是完全删除Db)。您还需要删除代码迁移。

确保在相关之后/之前“编译”项目(最好使它们在配置中自动编译)。

确保您的“连接”匹配。

一旦所有人都同步 - 一切都应该很好 - 但你必须保持同步。除非你打算删除Db(测试) - 不要像那样删除迁移(你可以使用Update-Database -0(我认为)回到某些迁移(这是'零状态')。

答案 4 :(得分:4)

我遇到了与此类似的问题,其中使用-force上的add-migration标志来重新构建现有迁移,并且没有明显原因停止工作。

无论我做了什么,我都得到了愚蠢的"无法生成显式迁移,因为以下显式迁移正在等待"错误信息。在尝试了几乎所有我能想到的东西并停止将我的笔记本电脑砸碎之后,出于绝望,我再次运行enable-migrations当然得到了#34;迁移已经在项目中启用了#39; Blah.Blah'"信息。再次尝试add-migration -force并且神奇地工作了。

我不知道它改变了什么 - 必须是源控制之外的一些用户设置/配置文件。希望这会帮助其他人。

答案 5 :(得分:3)

批量构建 - >干净的选择对我不起作用。

我通过以下方式解决了问题:

  1. 使用'添加迁移NameOfMigration'
  2. 创建迁移
  3. 删除已创建的迁移类的向上和向下功能的内容。
  4. 通过运行迁移脚本来更新数据库(只需使用' Update-Database -Verbose'
  5. 向_MigrationHistory表添加一行

    Web应用程序现在可以成功运行,所以基本上我遇到的问题是通过仅添加元数据来修复。

答案 6 :(得分:2)

我案中的问题是由:

引起的
  1. 创建迁移(成功)
  2. 决定我要重新创建它,并删除迁移.cs文件
  3. 尝试重新生成它,最后使用空迁移DownUp函数
  4. 在这种情况下,我忘了删除模型更改的ApplicationDbContextModelSnapshot.cs条目。删除此文件中的新映射解决了我的问题,然后正确生成。

答案 7 :(得分:0)

如果您使用流利的api来为DbSet设置配置,则不会有任何问题

答案 8 :(得分:0)

似乎我设法通过将模型和上下文类移动到另一个项目来解决问题。

我仍然不知道为什么会这样,这个解决方案根本就没有解决方案:(

答案 9 :(得分:0)

这件事发生在我身上,无济于事。然后我自己完成此操作,现在一切正常。

问题: 我创建了一个模型“汽车”。当我使用命令“ add-migartion AddCarModel”为其创建迁移时,创建了一个偏头痛,但它是空的。我尝试使用其他名称,也尝试删除迁移的.cs文件,但没有任何效果。然后我做了以下事情:

解决方案: 请按照以下步骤操作:

1。。删除您为模型创建的所有空迁移。 (但是请记住步骤2的迁移名称)

2。。还要从“ _MigrationHistory”表中删除这些迁移条目。

3。。注释掉模型数据库上下文中的行(在我的情况下是“ public DbSet Cars {get; set;}”)

4。。清理并重建解决方案。 (最好是分批清洁)

5。。请确保您的更新命令正在运行,并且不会引发错误。 (命令:“ update-database -verbose”)

6。。现在取消注释您在步骤3中注释过的行。

7。。现在为该模型创建迁移。 (我使用与以前相同的名称创建了迁移)

希望它能奏效。 :-)

答案 10 :(得分:0)

即使我删除了先前的迁移,我也必须运行dotnet ef migrations remove

答案 11 :(得分:0)

别忘了包含Public访问修饰符:

public string Text { get; set; }

答案 12 :(得分:0)

我在我的数据模型中添加了一个新类到子目录,使用add-migration对脚手架不可见结果命名空间。

修复是重命名新类的命名空间以符合模型的其余部分,和/或将“public virtual DbSet ..”等添加到实体上下文类中,这将要求您引用此新命名空间,然后再次运行add-migration。

答案 13 :(得分:0)

也许是最愚蠢的:

我正在添加一个与同名的迁移作为我正在创建的新对象。

答案 14 :(得分:0)

在我的情况下,这是因为我添加了辅助上下文' ApplicationDbContext'作为ASP.net身份的一部分。当我运行'启用 - 迁移'再次命令我得到一个错误,有多个上下文。一旦我结合起来,这两件事就开始了。

答案 15 :(得分:0)

我不得不删除由EF生成的_MigrationHistory表。然后我再次运行add-migration。但要小心,因为它将从头开始生成所需的查询,包括已经存在的表。

答案 16 :(得分:0)

我遇到了同样的问题。迁移已启用但未检测到任何更改。 我的解决方案是使用-Force属性重新启用迁移,然后一切正常。

  

Enable-Migrations -ProjectName -StartupProjectName --ConnectionStringName -Force