添加新迁移时,EF 数据迁移不会检测到更改

Posted

技术标签:

【中文标题】添加新迁移时,EF 数据迁移不会检测到更改【英文标题】:EF Data migrations won't detect changes when adding new migration 【发布时间】:2013-03-24 19:14:05 【问题描述】:

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

 "Add-migration AddedField"

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

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

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

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

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

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

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

【问题讨论】:

【参考方案1】:

我遇到了类似的问题,即找不到新的迁移,因此无论我做什么,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)”以外的文件夹中的旧/无效程序集。

要进行批量清理:

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

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

希望这对其他人有帮助。

【讨论】:

这也是我的问题。我想你没有任何关于为了解决这个问题而实际需要清理什么的信息? 不,再次,这表明 EF 工具/程序集正在查找默认构建输出位置(通常是 /bin/Debug)以外的位置,因为我反复清除了这些位置。顺便说一句,clean 命令还清除中间输出(例如 /obj/ 下的输出)。除此之外,我不确定它还会在哪里检查,如果您确定要弄清楚正在加载的确切内容,您可以尝试来自 sysinternals 的 filemon 之类的东西,但您应该期望通过输出进行筛选至少一个小时。 在我使用 VS 的所有岁月中,我什至从未注意到 Batch Build.. 我认为 Clean Solution 会做同样的事情,但它没有.. 只有 Batch Build > Clean 有效。谢谢【参考方案2】:

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

【讨论】:

这也是我的问题。如果新实体没有被 DbSet<T> 的上下文引用,它们显然不会被拾取。 +1 为此,您的实体必须作为 DbSet 包含在 ApplicationDbContext (或您正在使用的任何东西)中,否则它们将不会作为迁移脚本的一部分生成。 另外,如果您使用 Fluet API,请确保表关系正确。就我而言,我有一个可以为空的 FK。该字段在模型中被标记为可为空,在配置中被标记为 IsOptional 但我忘记更新多对多关系。 /*Forgot to replace HasRequired with HasOptional*/ HasOptional(a => a.License).WithMany(b => b.Stores).HasForeignKey(c => c.LicenseId).WillCascadeOnDelete(false); 我在这里,在午夜,在我收工之前将新模型放入迁移中,我正在摸不着头脑......然后我就像......“哦,是的。 .. duh,将其添加到 dbcontext”。 叹息我要睡觉了。【参考方案3】:

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

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

【讨论】:

天啊!感谢您的提示。【参考方案4】:

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

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

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

【讨论】:

谢谢!我也忘记删除ApplicationDbContextModelSnapshot.cs中的条目,导致新迁移为空。 @Christian Rondeau 在哪里可以找到 ApplicationDbContextModelSnapshot.cs 文件? @JPDolocanog 它应该在你的项目中,我不记得确切的文件夹,但如果你没有在源文件中找到它,那么我不知道......【参考方案5】:

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

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

您可以通读我制作的这个“摘要” - 从某处开始(但还要检查连接)。

Code first create tables

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

迁移的工作原理:

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

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

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

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

确保您的“连接”匹配。

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

【讨论】:

这个“迁移表”在哪里? @ChuckSavage - 我没有检查最新版本,但我认为它在系统表下,前缀为“__” 这确实是我的问题。我尝试运行会导致数据丢失(故意)的迁移,但被拒绝了。我再次使用 -Force 标志进行了操作,并且它起作用了,但是它创建了导致失调的“自动迁移”。删除它为我解决了。【参考方案6】:

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

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

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

【讨论】:

是的。兄弟。运行 enable-migrations 后,它神奇地工作了。【参考方案7】:

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

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

    使用“Add-Migration NameOfMigration”创建迁移 删除创建的迁移类的上下函数内容。 通过运行迁移脚本更新数据库(这只会使用“Update-Database -Verbose”向 _MigrationHistory 表中添加一行

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

【讨论】:

【参考方案8】:

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

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

【讨论】:

我所做的只是在我的 ApplicationDbContext 类定义中添加public DbSet<Vehicle> Vehicles get; set; ,运行一个新的迁移,它就成功了!谢谢罗伯【参考方案9】:

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

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

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

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

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

3. 注释掉模型数据库上下文的行(在我的例子中是“public DbSet Cars get; set; ”)

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

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

6.现在取消注释您在第 3 步中评论的行。

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

希望它有效。 :-)

【讨论】:

【参考方案10】:

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

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

【讨论】:

【参考方案11】:

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

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

【讨论】:

【参考方案12】:

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

【讨论】:

【参考方案13】:

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

【讨论】:

【参考方案14】:

也许是最愚蠢的:

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

【讨论】:

【参考方案15】:

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

【讨论】:

【参考方案16】:

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

【讨论】:

以上是关于添加新迁移时,EF 数据迁移不会检测到更改的主要内容,如果未能解决你的问题,请参考以下文章

EF 迁移 - 数据库中已有一个名为“”的对象

将 EF Core 迁移添加到现有数据库,同时仍允许从头开始创建数据库

数据库优先方法的 EF 迁移?

EF Core ASP.Net Core 编辑迁移

EF Core 5.0 - 更改“定义查询”映射实体时是不是需要生成迁移?

是否可以更改 EF 迁移“迁移”文件夹的位置?