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

时间:2012-03-22 07:10:21

标签: entity-framework ef-migrations

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

  

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

任何人都可以帮助我吗?

28 个答案:

答案 0 :(得分:73)

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

答案 1 :(得分:39)

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

答案 2 :(得分:30)

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

答案 3 :(得分:24)

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

答案 4 :(得分:13)

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

再次检查连接字符串。

确保您与连接的用户仍然有权阅读[__MigrationHistory]并且有权编辑架构。

您还可以尝试更改应用或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文件夹的项目,然后选择设置为启动项目。我很认真,这实际上可以提供帮助。

enter image description here

答案 5 :(得分:8)

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

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

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

答案 6 :(得分: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?

答案 7 :(得分:6)

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

angular.js:13550 Error: [$injector:undef] Provider 'gridServiceApi' must return a value from $get factory method.

其中:

Delta_Defect_0973 是您的迁移名称

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

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

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

答案 8 :(得分:5)

此错误表示在执行另一次显式迁移之前需要提交待定迁移。你可以选择

  1. 使用Update-Database命令
  2. 执行这些待定迁移
  3. 删除这些待处理的迁移。最安全的方法是打开Migrations文件夹,右键单击[201203170856167_left]>从项目中排除
  4. 在此之后,您可以再次开始“添加 - 迁移...”

    希望有所帮助

答案 9 :(得分:3)

存在歧义和错误。最好的方法是排除当前迁移文件并创建新迁移(添加迁移)文件,然后将新迁移的内容复制到排除文件并再次包含它并运行 update-database < / strong>命令。

答案 10 :(得分:3)

只是我的两分钱:

我的情景:

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

    要解决此问题,我只需 提供更明确的参数:

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

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

答案 11 :(得分:1)

我解决了类似的问题:

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

答案 12 :(得分:1)

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

答案 13 :(得分:1)

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

-Force是重要的一部分。

答案 14 :(得分:1)

这不会是很多人的答案,但是当EF无法连接到数据库时,它将忽略此错误。如果您像我一样在家工作,请确保您仍连接到VPN!

答案 15 :(得分:0)

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

最近,这对我来说已停止工作。

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

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

答案 16 :(得分:0)

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

答案 17 :(得分:0)

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

Add-Migration <Parameter>
Update-Database

答案 18 :(得分:0)

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

答案 19 :(得分:0)

旧帖子,但可能会对某人有所帮助。 对我而言,这是因为我将项目的Assembly nameDefault namespace重命名了。 因此,我不得不将ContextKey表中的_MigrationHisotry更新为Assembly nameDefault namespace的新值。老实说,我不知道应该使用哪一个,因为对我来说都是一样的!

答案 20 :(得分:0)

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

答案 21 :(得分:0)

我做了另一种方式。 我完全droped数据库并运行&#34; update-database&#34;再次在vs。

答案 22 :(得分:0)

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

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

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

Update-Database -Script -ConfigurationTypeName Configuration_ASPNETIdentity -ConnectionStringName SQL_AzureLive

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

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

答案 23 :(得分:0)

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

答案 24 :(得分:0)

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

答案 25 :(得分:0)

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

答案 26 :(得分:0)

<强>方案

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

<强>问题

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

  

无法生成显式迁移,因为以下内容   显式迁移正在等待:   [201607181944091_AddExternalEmailActivity]。应用待定的显式   尝试生成新的显式迁移之前的迁移。

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

  

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

<强>解决方案

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

答案 27 :(得分:-1)

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

在我的情况下,我将“migrationmigration”从“migration06”改为“migration04”。

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