无法在实体框架中生成显式迁移


96

我正在添加新的迁移,但是此消息显示:

无法生成显式迁移,因为以下显式迁移正在处理中:[201203170856167_left]。在尝试生成新的显式迁移之前,请应用未决的显式迁移。

谁能帮我?


11
当我不小心将启动项目切换到另一个项目时,这发生在我身上。您(或其他阅读此书的人)可能想尽快检查一下,然后再尝试进行更深入的故障排除(尤其是那些必须开始删除迁移内容的地方)。
NicholasFolk

在Migrations目录中有一个迁移类,该类在数据库的_MigrationHistory中没有更新。删除该类以使其在Migration目录和数据库中都具有相同的状态,解决了我的问题。
Aryan Firouzian

1
这是随机发生在我身上的。当发生这种情况时,表明我的所有迁移都需要应用。我必须重新启动Visual Studio才能使其正常工作,因为我已经正确设置了所有内容。
拉里·弗洛威尔

Answers:


81

它告诉您应用程序中有一些未处理的迁移,它需要运行Update-Database才能添加另一个迁移。


12
我要重新创建初始迁移吗?这会阻止您这样做吗?
丽贝卡2012年

对我不起作用,更新数据库给了我另一个错误。我必须先删除待处理的文件。
Vahx 2015年

1
托马斯的答案对我的类似案子是有用的。
Tarek Shawadfy 2015年

2
可能有必要声明一个启动项目-StartupProject ContentHub.Database
osanger

2
Update-Database给出>由于有待处理的更改而无法更新数据库以匹配当前模型
ASpirin

53

我有同样的问题。显然,当无法连接到数据库时,实体框架会生成此错误。因此,在搜索其他问题之前,请确保您能够访问它。


1
我还要补充一点,将App.config移至另一个项目,或者项目中只是普通缺少的项目,或者项目中的项目配置不正确,情况就是这样。
Code Maverick

IP更改后我也遇到了同样的错误(在切换位置和dyn dns更改后都发生)。这导致我们用来撤销登录的Azure数据库中的防火墙。无奈的EF迁移给出了以上错误,而不是“无法登录” ...
Victor,

8
我想说明的另一点是,确保检查您的启动项目是否与数据库上下文的连接字符串相匹配。当我临时更改启动项目并且没有意识到另一个项目没有相同的连接字符串时,我遇到了这个问题。
Gage Trader

添加到@GageTrader:我有多个启动项目,一个没有配置,而Web项目则带有EF-config。具有迁移的(Repository)项目在其app.config中具有与Web项目相同的EF配置。但是,即使我选择了存储库项目作为启动项目,它也没有起作用,但是当我将Web项目设置为启动时,它却起作用了。
JimiSweden

我必须明确声明-ConnectionString参数,这对我来说很成功
Brian Colavito

34

您需要从程序包管理器控制台运行“ update-database”以将更改推送到数据库,或者可以从“迁移”文件夹中删除挂起的迁移文件([201203170856167_left]),然后重新运行“ add-migration”到根据您的修改创建一个全新的迁移。


我删除了迁移文件并运行了add-migration,但是它仍然出现相同的错误。
2014年

2
谢谢,关于删除挂起的迁移文件的提示是一个救命稻草
Manish

31

此错误也可能意味着不再识别迁移。这在更改Migrations.Configuration中的ContextKey的值后发生在我身上。解决方案只是更新数据库表“ __MigrationHistory”中的ContextKey(或还原我猜为Configuration的值)。您的应用程序中的ContextKey和命名空间应该匹配。


1
这是我的情况的正确答案。当我将一个旧项目用于一个新的类似项目时,我无法通过旧迁移对数据库进行更改。正如Thomas所建议的那样,迁移中的名称空间与_MigrationsHistory表中的Contextkey不同,这导致旧的迁移无法被识别。
Tarek Shawadfy 2015年

1
这对我有所帮助,因为我通过重命名解决方案导致了问题。在此过程中,我已重命名了ContextKey,使其不再与_MigrationHistory条目匹配。
乔尔

对我也有用,在配置中设置一个显式上下文键,在__MigrationHistory中对其进行更改,并且update-database确定一切都很棒。谢谢!
詹姆斯·怀特

2
可笑,但这是正确的。如果您更新了项目名称,或者将您的项目(我的情况)分成几个项目,并且试图将新项目中的新迁移添加到同一数据库,则必须使用正确的ContextKey,可以在Configuration构造函数中进行设置(您必须使用目标DB的__MigrationHistory表中的Context键)
BotanMan

同样在这里,我重命名了我的默认名称空间,并在整个解决方案
中将

18

1.连接字符串/连接权限

再次检查连接字符串。

确保您正在连接的用户仍然有权读取[__MigrationHistory]权限和编辑模式的权限。

您也可以尝试改变连接字符串中的应用程序或Web配置文件使用集成安全性(Windows验证)作为运行附件迁移命令自己

例如:

connectionString="data source=server;initial catalog=db;persist security info=True;Integrated Security=SSPI;" 

此连接字符串将放在DbContext所在项目的App.config文件中。

2.启动项目

你可以在命令行上的启动项目,或者你可以右键点击与该项目DbContextConfiguration并迁移文件夹并选择设为启动项目。我是认真的,这实际上可以有所帮助。

在此处输入图片说明


哈哈。我希望这能获得更多投票。这在我身上经常发生,而且Integrated Security修复效果很好!
杰西(Jess)

1
我遇到了同样的问题,所有迁移命令均无效。原来没有设置启动项目才是罪魁祸首。设置解决了我的问题。
维沙尔(Vishal)

更改启动项目对我有用!我确定它不会起作用,但我还是尝试了一下,因为其他所有操作都失败了。好答案。
西尔文·罗德里格

“设置为启动”- 永远不会猜到!谢谢!!
Jasel

1
是的,我有意更改了启动项目,却忘了将其改回。有趣的是,之前的迁移是通过适当的启动项目完成的,因此一切正常。但这现在是合乎逻辑的-b / c EF从项目中获取连接字符串,因此“不知道”迁移实际上已经应用于DB ...
kosist,

8

遇到了同样的问题,并且能够通过上述答案解决一些提示:

  • 在程序包管理器控制台中,检查默认项目(指向带有迁移配置的项目
  • 确保startup-proj具有带有有效连接字符串的web.config(或
  • 确保进行迁移的项目具有带有有效连接字符串的app.config / web.config
  • 检查数据库中的权限(针对您在连接字符串中配置的用户)

在程序包管理器控制台中使用“ update-database -verbose”来获取迁移尝试连接的更具体的信息。(在我的案例中,帮助发现我的启动项目设置不正确...)


2
运行“ update-database -verbose”,并注意到我的连接字符串已损坏,大声笑。因此,add-migration命令会给出错误消息。
Wachburn '16

4
“确保启动项目{...}”解决了我的问题。谢谢@flex
Andy Schmitt


7

遇到此问题时,请尝试将参数添加到您的add-migration cmdlet中。例如,指定启动项目以及连接字符串名称可以帮助EF查找目标数据库。

add-migration Delta_Defect_0973 -ConfigurationTypeName your.namespace.ContextClassName -StartUpProject DeltaProject -ConnectionStringName DeltaSQL

哪里:

Delta_Defect_0973是您的迁移名称

your.namespace.ContextClassName是迁移文件夹中您的Configuration类的名称,其前缀为全名空间。

DeltaProject是带有web.config或app.config文件的主项目的名称。

DeltaSQL是在web.config或app.config文件中定义的连接字符串的名称。


谢谢。这真的帮助了我。
杰西

另外,如果您在解决方案中使用依赖项注入,则可能必须在程序包管理器控制台中选择其他默认项目。如果EF无法找到您的迁移,请尝试选择实际包含迁移的项目作为默认项目。
伊夫·罗雄

5

此错误意味着在执行另一个显式迁移之前,需要提交待处理的迁移。您可以选择

  1. 使用Update-Database命令执行那些挂起的迁移
  2. 删除那些暂挂的迁移。最安全的方法是打开“迁移”文件夹,右键单击[201203170856167_left]>从项目中排除

完成这一步后,您可以再次启动“添加迁移...”

希望能帮助到你


4

只是我的两分钱:

我的情况:

  1. 我将本地数据库恢复到工作状态。
  2. 已经进行了迁移。
  3. 每当我尝试添加新的迁移时,都会收到关于OP的待处理迁移的错误消息。

解:

为了解决这个问题,我只提供了更明确的参数:

Add-Migration -ConnectionString "Server=localhost\SQLEXPRESS;Database=YourDataBase;Trusted_Connection=True;" -ConnectionProviderName "System.Data.SqlClient" -verbose

我相信您可以在app.config文件夹中设置一个设置,以允许您默认此行​​为,因此您不必每次都提供明确的参数。但是,我不确定如何执行此操作。


1
这对我有用,我只是在上面显示的命令末尾添加了迁移的名称。
sfors说恢复Monica's 17-10-12

1
=)-很高兴我能帮上忙。
IbrarMumtaz

1
-ConnectionStringName是此方法的替代方法,它将按名称从配置中提取连接字符串
Simon_Weaver

1
这对我有帮助,因为我没有将连接字符串存储在配置文件中
Sasinosoft '19

3

存在歧义,因此会出错。最好的方法是排除当前迁移文件并创建新的迁移(add-migration)文件,然后将新迁移的内容复制到排除的文件中,然后再次包含它并运行update-database命令。


我只是运行了update-database命令,然后重试了add-migration命令,它起作用了
Smitty-Werben-Jager-Manjenson,

3

我解决了类似的问题:

  • 删除旧的迁移文件
  • 更新数据库力
  • 添加迁移AddedEntity
  • 更新数据库

1

我遇到了同样的问题,只能通过运行Add-Migration'MigrationName'-Force来解决

-Force是重要的部分。


1

我的本地数据库不存在__MigrationHistory或不存在。我手动创建了表,然后将该表中的数据从PROD迁移到了本地数据库。这使VS认为迁移已被应用(已经被应用)。


我遇到了同样的问题,我将活动数据库合并到生产中,但是迁移历史记录丢失了。
matthy,

1

提示:-Script如果不确定,最好将开关用于迁移命令。它也确实有助于了解什么Update-Database实际情况。

我运行以下命令更新数据库,然后得到一个可以手动应用的脚本(或仅在不使用-Script标记的情况下再次运行)。

因为Update-Database我会运行以下命令:

Update-Database -Script -ConfigurationTypeName Configuration_ASPNETIdentity -ConnectionStringName SQL_AzureLive

哪里 SQL_AzureLive我的配置中的命名连接字符串在。

然后,我可以验证SQL看起来正确,应用并完成。正如许多其他人所说的那样,如果连接字符串错误或无效,则会出现此错误。


1

对我来说,我从Migrations文件夹中删除了迁移文件(在您的情况下为“ 201203170856167_left”),然后在Package Manager控制台中运行以下命令

Add-Migration <Parameter>
Update-Database

0

情境

  • 我正在创建新数据库迁移的分支中工作。
  • 我准备从master进行更新,但是master也有最近的数据库迁移。
  • 我删除分支的数据库迁移以防止发生冲突。
  • 我“从主人那里更新”。

问题

从主服务器更新后,我运行“ Add-Migration my_migration_name”,但出现以下错误:

无法生成显式迁移,因为以下显式迁移正在处理中:[201607181944091_AddExternalEmailActivity]。在尝试生成新的显式迁移之前,请应用未决的显式迁移。

因此,我运行“ Update-Database”并得到以下错误:

无法更新数据库以匹配当前模型,因为有未决的更改并且自动迁移被禁用

此时,重新运行“ Add-Migration my_migration_name”解决了我的问题。我的理论是,运行“ Update-Database”使一切都处于“ Add-Migration”工作所需的状态。


0

我也遇到了这个问题。当我创建新的数据库并且我的代码优先的数据库迁移有待更改时,然后我尝试运行“ Update-Database”命令。解决方案:运行“ Add-Migration -MigrationName”命令为新数据库创建新迁移。然后运行“ Update-Database”命令。


0

对于运行Add-Migration时我知道最新的数据库,我也有这个问题。只需再次运行Add-Migration命令即可解决。如上面的Robin Dorbell所建议的,怀疑连接问题。


在我的场景中,运行命令时,数据库名称区分大小写。只要使连接
字符串

0

当我突然重命名数据库中已经存在的旧迁移类时,便发生了这种情况。我检查了VCS历史记录,确定了该历史记录并重命名了。之后所有工作。



0

我有一个简单的问题。当我与工作站上连接的客户端站点建立VPN连接时,VS错误地报告了此错误。问题在于DBMS安全性设置为仅接受来自我的真实本地IP的请求。只需关闭VPN即可解决问题。


0

就我而言,我忘记在Azure的防火墙规则中添加我的IP地址,基本上是因为我无法连接到数据库而导致出现此错误。因此,特别针对我的情况,我在Azure的数据库防火墙规则中添加了IP地址,并且一切正常。除此之外,这可能是代理/互联网连接/数据库用户名密码/数据库连接字符串等问题。或者显然,您可能需要执行Update-Database命令的挂起迁移。


0

从历史上看,我总是通过删除挂起的迁移来解决此问题,或者如果只剩下1个并且最需要迁移,则使用-f重新创建来解决。

最近,这已停止为我工作。

第一次发生这种情况时,我重新启动了Visual Studio,然后让我继续。

第二次,它只有在我对该项目运行“清理”之后才起作用。尽管删除了资源管理器中的所有文件,但几乎好像保留了待处理的迁移。


0

对于许多人来说,这并不是解决问题的方法,但是当EF无法连接到数据库时,它将放弃该错误。如果您像我一样在家工作,请确保您仍连接到VPN!


-1

从迁移到另一个迁移后,我遭受了完全相同的问题。

就我而言,我将“ targetedmigration”从“ migration06”迁移到“ migration04”。

我需要删除“ migration0” 6,然后可以强制创建“ migration05”。这基本上意味着您只需要在目标迁移之后进行下一次迁移即可。


-1

就我而言(使用MS Visual Studio),它就像重新启动Visual Studio一样简单。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.