繁体   English   中英

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

[英]Unable to generate an explicit migration in entity framework

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

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

谁能帮我?

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

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

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

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

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

再次检查连接字符串。

确保您所连接的用户仍然有权从[__MigrationHistory]读取[__MigrationHistory]并有权编辑架构。

您还可以尝试更改应用程序或 Web 配置文件中的连接字符串,以使用集成安全性(Windows 身份验证) 以自己的身份运行 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 我是认真的,这实际上可以提供帮助。

在此处输入图片说明

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

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

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

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

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

我直接从这里复制了此文本: 如何撤消最后一个 Add-Migration 命令?

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

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

在哪里:

Delta_Defect_0973是您的迁移名称

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

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

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

我解决了同样的问题:

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

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

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

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

希望能帮助到你

只是我的两分钱:

我的场景:

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

解决方案:

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

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

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

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

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

-Force 是重要的部分。

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

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

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

对于Update-Database我将运行以下命令:

Update-Database -Script -ConfigurationTypeName Configuration_ASPNETIdentity -ConnectionStringName SQL_AzureLive

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

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

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

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

Add-Migration <Parameter>
Update-Database

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

设想

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

问题

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

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

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

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

解决方案

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

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

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

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

我做了另一种方式。 我完全删除了数据库并在 vs. 中再次运行“更新数据库”。

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

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

最近,这对我不起作用。

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

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

旧帖子,但可能会帮助某人。 对我来说,这是因为我重Default namespace了项目的Assembly nameDefault namespace 因此,我不得不更新ContextKey_MigrationHisotry表中的新值Assembly nameDefault namespace 老实说,我不知道应该使用哪个,因为对我来说两者都是一样的!

就我而言,只是将启动项目更改为包含我的迁移文件夹的项目,还要确保您在包控制台管理器中选择了相同的项目。

您只需在 NuGet package 管理器控制台中使用此命令更新您的数据库。 更新数据库

我刚刚看到这个,这是因为 SQL 登录帐户(在连接字符串中使用)在 SQL Server Management Studio 中设置了“强制密码过期”,密码已过期! 因此它无法连接到数据库以查看现有的迁移!

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

在我的情况下,我从“migration06”“targetedmigration”到“migration04”。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM