44

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

 "Add-migration AddedField"

我得到的只是一个名为“n_AddedField”的空迁移,向上和向下方法不包含任何逻辑。

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

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

我不知道 EF 为什么以及如何仍然记得这些迁移。我什至尝试搜索文件内容以查看迁移是否保存在其他地方或其他地方。但是什么都没有。。

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

项目开始时,我们使用的是 EF 4.x,不久前切换到 5.0,但自从切换后,我已经成功添加了一堆迁移。

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

4

16 回答 16

47

我有一个类似的问题,没有找到新的迁移,所以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 正在使用文件夹中的旧/无效程序集,而不是当前选择的“解决方案配置(例如调试)”。

要进行批量清理:

  1. 选择Main Menu -> Build -> Batch Build...
  2. 点击Select All
  3. 点击Clean

关闭对话框,重建并重新尝试迁移。

希望这对其他人有帮助。

于 2015-01-12T04:47:31.560 回答
38

哎呀。就我而言,我正在添加一个未被任何其他实体引用的新根实体。结果很简单,代码首先没有理由为实体生成迁移。一旦我将代码添加到 DbContext(一个 dbset)中,它就像一个魅力。

于 2016-03-10T12:31:44.210 回答
13

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

可能不是你的情况,但它可能会帮助别人。

于 2015-11-27T17:53:30.227 回答
11

我的问题是由以下原因引起的:

  1. 创建迁移(成功)
  2. 决定我要重新创建它,并删除迁移.cs文件
  3. 尝试重新生成它,并以空迁移DownUp功能结束

在这种情况下,我忘了删除ApplicationDbContextModelSnapshot.cs模型更改的条目。删除此文件中的新映射解决了我的问题,然后正确生成。

于 2016-05-20T14:38:51.357 回答
9

你“不同步”——数据库、迁移、代码——你可能会遇到各种各样的问题。

我这样做了million times(几乎:)而且效果很好——但你需要保持稳定,对你正在做的事情一丝不苟。

你可以通读我做的这个“总结”——从某个地方开始(但也要检查连接)。

代码先创建表

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

迁移的工作原理:

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

何时Add-Migration运行 - 它检查“现有数据库”结构和迁移表 - 并产生“差异”(有时你没有得到任何“向上”“向下”,因为它们也是同步的)。

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

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

确保您的“连接”匹配。

一旦一切都同步了——一切都应该很好地工作——但你必须保持同步。除非您打算删除 Db(测试) - 不要像那样删除迁移(您可以使用Update-Database -0(我认为)返回某些迁移(这是“零状态”)。

于 2013-04-03T17:24:29.630 回答
7

我遇到了与此类似的问题,在该问题上,使用-forceon 标志add-migration重新构建现有迁移无缘无故停止工作。

无论我做什么,我都会收到愚蠢的“无法生成显式迁移,因为以下显式迁移正在等待”错误消息。在尝试了我能想到的几乎所有事情并且没有把我的笔记本电脑砸成碎片之后,出于绝望,我enable-migrations再次跑了,当然得到了“迁移已经在项目'Blah.Blah'中启用”消息。再次尝试add-migration -force,神奇地它起作用了。

我不知道它改变了什么——一定是源代码控制之外的一些用户设置/配置文件。希望这会对其他人有所帮助。

于 2014-09-05T15:06:25.773 回答
5

批量构建 -> 清洁选项对我不起作用。

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

  1. 使用“Add-Migration NameOfMigration”创建迁移
  2. 删除创建的迁移类的 up 和 down 函数的内容。
  3. 通过运行迁移脚本来更新数据库(它只会使用“Update-Database -Verbose”向 _MigrationHistory 表中添加一行

Web 应用程序现在成功运行,所以基本上我遇到了一个问题,该问题仅通过添加元数据来解决。

于 2016-04-19T02:26:39.133 回答
1

我将一个新类添加到我的数据模型的子目录中,使用添加迁移的脚手架看不到生成的命名空间。

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

于 2018-03-15T00:00:39.340 回答
1

它发生在我身上,没有任何效果。然后我自己做了这个,现在一切正常。

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

解决方法: 按照以下步骤:

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

2.同时从“_MigrationHistory”表中删除那些迁移条目。

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

4.清洁和重建解决方案。(最好是批量清洁)

5.确保您的更新命令正常工作并且没有抛出错误。(命令:“更新数据库 -verbose”)

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

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

希望它有效。:-)

于 2020-06-10T12:17:08.383 回答
0

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

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

于 2013-04-03T08:47:39.813 回答
0

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

启用迁移 -ProjectName -StartupProjectName --ConnectionStringName -Force

于 2015-09-29T08:30:09.970 回答
0

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

于 2016-02-08T23:19:31.093 回答
0

就我而言,这是因为我添加了一个辅助上下文“ApplicationDbContext”作为 ASP.net 身份信息的一部分。当我再次运行“启用迁移”命令时,我收到一个错误,提示存在多个上下文。一旦我将这两件事结合起来,就又开始工作了。

于 2016-03-16T18:11:37.040 回答
0

也许是最愚蠢的:

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

于 2017-11-02T11:23:27.777 回答
0

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

于 2020-06-01T02:48:54.800 回答
0

如果您使用 fluent api 为 DbSet 设置配置,那么您将不会遇到任何问题

于 2020-09-27T09:18:56.730 回答