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

问题描述 投票:84回答:24

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

无法生成显式迁移,因为以下显式迁移正在等待处理:[201203170856167_left]。在尝试生成新的显式迁移之前应用挂起的显式迁移。

谁能帮我?

entity-framework ef-migrations
24个回答
74
投票

它告诉您应用程序中存在一些未处理的迁移,并且需要先运行Update-Database才能添加其他迁移。


3
投票

只是我的两分钱:

我的情景:

  1. 我将本地数据库恢复到工作状态。
  2. 已经有适用于它的迁移。
  3. 每当我尝试添加新迁移时,我都会收到有关待处理迁移的错误,如我提到的那样。

解:

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

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

我始终相信您可以在app.config文件夹中设置一个设置,以允许您默认此行​​为,因此您不必每次都提供显式参数。但是我不知道如何做到这一点。


3
投票

有一种模棱两可的错误。最好的方法是排除当前迁移文件并创建新迁移(添加迁移)文件,然后将新迁移的内容复制到排除文件并再次包含它并运行update-database命令。


1
投票

我有同样的问题,只能解决它运行Add-Migration'RemigrationName'-Force

随着-Force成为重要的一部分。


1
投票

我的本地数据库没有填充或存在__MigrationHistory。我手动创建了表,然后将该表中的数据从PROD迁移到我的本地数据库。这导致VS认为已经应用了迁移(他们曾经使用过)。


1
投票

提示:如果您不确定,最好使用-Script开关进行迁移命令。它也真的有助于理解Update-Database实际上做了什么。

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

对于Update-Database,我会运行以下内容:

Update-Database -Script -ConfigurationTypeName Configuration_ASPNETIdentity -ConnectionStringName SQL_AzureLive

其中SQL_AzureLive是我的配置中的命名连接字符串。

然后我可以验证SQL看起来正确,应用它并完成。正如许多其他人所说,如果连接字符串错误或无效,您将收到此错误。


1
投票

我解决了同样的问题:

  • 删除旧的迁移文件
  • update-database -force
  • Add-Migration AddedEntity
  • 更新数据库

0
投票

脚本

  • 我正在一个分支机构中工作,我在其中创建了一个新的数据库迁移。
  • 我准备从master更新,但master有一个最近的数据库迁移工具。
  • 我删除了我的分支的db迁移以防止冲突。
  • 我“从主人更新”。

问题

从master更新后,我运行“Add-Migration my_migration_name”,但得到以下错误:

由于以下显式迁移未决,因此无法生成显式迁移:[201607181944091_AddExternalEmailActivity]。在尝试生成新的显式迁移之前应用挂起的显式迁移。

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

无法更新数据库以匹配当前模型,因为存在挂起的更改并且已禁用自动迁移

此时重新运行“Add-Migration my_migration_name”解决了我的问题。我的理论是,运行“更​​新 - 数据库”使得所有状态都需要“添加 - 迁移”才能工作。


0
投票

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


0
投票

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


0
投票

当我突然重命名已经存在于db中的旧迁移类时,就发生了这种情况。我检查了VCS历史记录,确定并重命名。之后全部工作。


40
投票

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


0
投票

我做了另一种方式。我完全删除了数据库并再次运行“update-database”


0
投票

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


0
投票

在我的情况下(使用MS Visual Studio),它就像重新启动Visual Studio一样简单。


0
投票

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

Add-Migration <Parameter>
Update-Database

-1
投票

在从迁移恢复到另一个迁移后,我遇到了完全相同的问题。

就我而言,我将“迁移”从“迁移06”迁移到“迁移04”。

我需要删除“迁移0”6然后我才能强制创建“迁移05”。这基本上意味着您需要在目标迁移之后保留下一次迁移。


30
投票

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


24
投票

此错误还可能意味着不再识别迁移。在Migrations.Configuration中更改了ContextKey的值后,发生了这种情况。解决方案只是更新数据库表“__MigrationHistory”中的ContextKey(或者我想在Configuration类中恢复值)。应用程序中的ContextKey和Namespace应该匹配。


13
投票

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

再次检查连接字符串。

确保您要连接的用户仍具有从[__MigrationHistory]读取的权限,并且具有编辑架构的权限。

您还可以尝试更改App或Web配置文件中的连接字符串,以使用Integrated Security(Windows Auth)自行运行add-migration命令。

例如:

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

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

2.启动项目

您可以在命令行上指定StartUp项目,也可以使用DbContextConfiguration和Migrations文件夹右键单击项目,然后选择Set as StartUp project。我很认真,这实际上可以提供帮助。

enter image description here


8
投票

有同样的问题,能够通过以上答案的一些提示解决:

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

在程序包管理器控制台中使用“update-database -verbose”以获取迁移尝试连接到的更具体的信息。 (在我的情况下帮我找到我的启动项目没有正确设置......)


6
投票

如果你还没有使用过Update-Database,你可以删除它。如果您运行更新,则使用Update-Database -TargetMigration "NameOfPreviousMigration"将其回滚,然后将其删除。

参考:http://elegantcode.com/2012/04/12/entity-framework-migrations-tips/

我直接从这里复制了这个文本:How do I undo the last Add-Migration command?


6
投票

遇到此问题时,请尝试向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文件中定义的连接字符串的名称。


5
投票

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

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

在此之后,您可以再次启动“添加 - 迁移...”

希望能帮助到你

© www.soinside.com 2019 - 2024. All rights reserved.