如何使用 EF Core 在 ASP.NET Core 中取消应用迁移

Posted

技术标签:

【中文标题】如何使用 EF Core 在 ASP.NET Core 中取消应用迁移【英文标题】:How to unapply a migration in ASP.NET Core with EF Core 【发布时间】:2016-11-06 15:25:03 【问题描述】:

当我在 VS2015 中使用 EF Core 的 ASP.NET Core 项目运行 PM> Remove-Migration -context BloggingContext 时,我收到以下错误:

System.InvalidOperationException: The migration '20160703192724_MyFirstMigration' has already been applied to the database. Unapply it and try again. If the migration has been applied to other databases, consider reverting its changes using a new migration.    at Microsoft.EntityFrameworkCore.Migrations.Design.MigrationsScaffolder.RemoveMigration(String projectDir, String rootNamespace, Boolean force) 
    at Microsoft.EntityFrameworkCore.Design.MigrationsOperations.RemoveMigration(String contextType, Boolean force) 
    at Microsoft.EntityFrameworkCore.Tools.Cli.MigrationsRemoveCommand.<>c__DisplayClass0_0.<Configure>b__0() 
    at Microsoft.Extensions.CommandLineUtils.CommandLineApplication.Execute(String[] args) 
    at Microsoft.EntityFrameworkCore.Tools.Cli.Program.Main(String[] args) 
 The migration '20160703192724_MyFirstMigration' has already been applied to the database. Unapply it and try again. If the migration has been applied to other databases, consider reverting its changes using a new migration.

如何取消应用?我正在使用最新版本的 ASP.NET Core 1.0、EF Core 和 VS2015 Update 3。

【问题讨论】:

尝试在末尾添加-force 文章learnentityframeworkcore.com/migrations#reversing-a-migration 描述了这些步骤。感谢@drewskis 的链接 【参考方案1】:

用途:

CLI

&gt; dotnet ef database update &lt;previous-migration-name&gt;

包管理器控制台

PM&gt; Update-Database &lt;previous-migration-name&gt;

例子:

PM&gt; Update-Database MyInitialMigration

然后尝试删除上次迁移。

在不更新数据库的情况下删除迁移不起作用,因为您将更改应用于数据库。

如果使用 PMC,请尝试: PM> 更新数据库 0 这将擦除数据库并允许您删除解决方案上的迁移快照

【讨论】:

我仍然遇到同样的错误。我首先使用了成功的dotnet ef database update MyFirstMigration --context BloggingContext。然后我跑了dotnet ef migrations remove --context BloggingContext,它给了我和我的帖子一样的错误信息 您需要在MyFirstMigration 之前更新到迁移。如果这是第一次迁移(顾名思义),那么您可以使用dotnet ef database update 0 来恢复(取消应用)数据库中的所有迁移。然后你应该能够运行dotnet ef migrations remove 另外值得注意的是,您应该只使用迁移的名称,不包括日期前缀 在此之后致电dotnet ef migrations remove 您的第二个陈述:“然后尝试删除上次迁移”在此答案中不完整,请准确说出您的意思。删除迁移文件?执行命令? ...【参考方案2】:

要完全删除所有迁移并重新开始,请执行以下操作:

dotnet ef database update 0
dotnet ef migrations remove

【讨论】:

但您不想删除所有迁移。例如,您希望保留 VS 在 Data\Migrations 文件夹下为身份(用户帐户)创建的默认迁移。 很高兴知道dotnet ef database update 0,但之后运行dotnet ef migrations remove 将删除身份的默认迁移,这可能是不希望的。 @nam "但是您不想删除所有迁移。"但我们中的一些人这样做。不要假设我想要什么:) 这对我不起作用。第一行没问题并删除所有迁移,在第二行我仍然得到The migration '20180618103514_InitialMigration' has already been applied to the database. Revert it and try again. If the migration has been applied to other databases, consider reverting its changes using a new migration. @ShimmyWeitzhandler 是的。 ***.com/a/55323154/109941【参考方案3】:

取消应用特定迁移

dotnet ef database update LastGoodMigrationName
or
PM> Update-Database -Migration LastGoodMigrationName

取消应用所有迁移

dotnet ef database update 0
or
PM> Update-Database -Migration 0

要删除上次迁移:

dotnet ef migrations remove
or
PM> Remove-Migration

要删除所有迁移:

只需删除 Migrations 文件夹。

要删除最后几个迁移(不是全部):

没有删除大量迁移的命令,我们不能只删除这几个migrations 和它们的*.designer.cs 文件,因为我们需要保持快照文件处于一致状态。我们需要一一移除迁移(参见上面的To remove last migration)。

取消应用并删除上次迁移:

dotnet ef migrations remove --force
or
PM> Remove-Migration -Force

【讨论】:

我一直在这些帖子中看到unapply这个词。我突然想到这不是一个技术术语,而是un - apply这个词 不知道“down”这个方法是干什么用的? 在我的 Visual Studio IDE 中查看名为 Migrations 的文件夹并在我的包管理器控制台中运行上述命令时,如果此答案能说明预期结果,那将非常有用。例如,删除是否会影响 Migrations 文件夹的内容?也就是说,应该删除由Add-Migration 产生的文件,还是保留它们并且我需要手动删除它们?谢谢! dotnet ef migrations remove --force 在 ef core 中为我工作 @Pajri Aprilio 删除迁移时,“向下”部分列出了撤消所述迁移所需的步骤。【参考方案4】:

要恢复上次应用的迁移,您应该(包管理器控制台命令):

    从数据库恢复迁移:PM&gt; Update-Database &lt;prior-migration-name&gt; 从项目中删除迁移文件(否则将在下一步重新应用) 更新模型快照:PM&gt; Remove-Migration

UPD: 最新版本的 Visual Studio (2017) 似乎不需要第二步。

【讨论】:

谢谢!这非常有效,令人着迷的是,在所有解决方案中,没有人提到过第 2 步的必要性。 是的,没有人提到第二步。谢谢 不确定第二步,在我的情况下(最新的VS2017)迁移文件将在调用Remove-Migration后自动删除,没有问题。我不确定您所说的“它将在下一步重新应用”! @S.Serpooshan 确实如此。我手动删除了它,但是当我运行 Remove-Migration 时,它抱怨我之前的迁移已应用于数据库。但是,它有效。 我认为只有在你的 startup.cs 中调用 dbContext.Database.Migrate() 时才需要第二步【参考方案5】:

您仍然可以使用Update-Database 命令。

Update-Database -Migration <migration name> -Context <context name>

但是,从您的迁移名称来看,我假设这是第一次迁移,因此该命令可能不起作用。您应该能够从数据库中的__MigrationHistory 表中删除该条目,然后再次运行Remove-Migration 命令。您也可以删除迁移文件,然后重新开始。

【讨论】:

您可以从包管理控制台调用Update-Database,或者从项目目录的命令提示符调用dotnet ef database update 只是为了澄清布拉德的答案 - &lt;migration name&gt; 应该是您想要返回的迁移的名称(即可能是迁移之前 您搞砸的那个),而不是您要撤消的迁移的名称。【参考方案6】:

您应该从 '_EFMigrationsHistory' 表中删除迁移 '20160703192724_MyFirstMigration' 记录。

否则以下命令将删除迁移并删除迁移文件夹:

PMC 命令:

   > remove-migration -force

CLI 命令:

   > dotnet ef migrations remove -f

Link About CLI Commands

Link About PMC Commands

【讨论】:

【参考方案7】:

您只需按值定位迁移

 Update-Database -Migration:0

然后继续删除它

 Remove-Migration

【讨论】:

这对我有用,但我在 VS2017 中使用 EF 和 .NET core 2.0 注意:-Migration:0 表示返回到没有迁移的状态。这将清除您的数据库 是的,根据提出的问题。您可以根据要回滚到的迁移来增加值 在 .Net Core 3.1 中工作【参考方案8】:

在包管理器控制台中:

Update-Database Your_Migration_You_Want_To_Revert_To

More options and explanation on how to revert migrations can be seen here

【讨论】:

有用的链接,应该是问题的评论 这就是你想在 .NET core 中使用的东西【参考方案9】:

在已经应用到数据库之后“取消应用”最近的(最近的?)迁移:

    打开 SQL Server 对象资源管理器(查看 ->“SQL Server 对象资源管理器”) 通过将小三角形展开到侧面,导航到链接到您的项目的数据库。 展开“表格” 找到名为“dbo._EFMigrationsHistory”的表。 右键单击它并选择“查看数据”以在 Visual Studio 中查看表条目。 删除与您要取消应用的迁移对应的行(如果出现提示,请对警告说“是”)。 在包含 project.json 文件的目录中的命令窗口中再次运行“dotnet ef migrations remove”。或者,在包管理器控制台中运行“Remove-Migration”命令。

希望这有助于并适用于项目中的任何迁移...我仅对最近的迁移进行了测试...

编码愉快!

【讨论】:

这实际上不会取消应用迁移,只是让框架“认为”它尚未应用。如果您这样做,您的数据库将处于不一致的状态。 手动编辑 __EFMigrationsHistory 中的数据是一个糟糕的建议。不要这样做。该表仅供迁移工具在后台使用。如果您开始手动编辑数据,一个错误可能会在您的项目中产生各种疯狂的意外行为。使用其他推荐的解决方案之一是一个更好的主意。 我们遇到过这样一种情况,一名初级团队成员对切换分支感到困惑,并最终从这两个分支中手动删除了迁移(尽管它仍然在 __EFMigrationsHistory 表中,因为它已经应用了),所以我们丢了“倒”。这就是我们最终不得不做的,加上 SSMS 中的一些手动反转。所以不要这样做——除非你此时别无选择。至少他所做的只是添加了一个新字段。【参考方案10】:

通常,如果您使用包管理器控制台,删除特定迁移的正确方法是引用迁移的名称

Update-Database -Migration Name of Migration -Context context

根据docs 删除您上次应用的迁移的另一种方法是使用以下命令:

dotnet ef migrations remove

此命令应从解决方案目录中的开发人员命令提示符 (how to open command prompt) 执行。

例如,如果您的应用程序位于名称“Application”内并且位于文件夹 c:\Projects 中。那么你的路径应该是:

C:\Projects\Application

【讨论】:

问题是,如果 `dotnet ef migrations remove' 返回错误“迁移已应用于数据库”,该怎么办【参考方案11】:

要恢复应用于 DB 的所有迁移,只需运行:

update-database 0

之后应该运行Remove-Migration 的次数与迁移目录中可见的迁移文件一样多。该命令会删除最新的迁移并更新快照。

【讨论】:

【参考方案12】:

更多细节和解决方案在这里:

我不明白为什么我们在这里搞混了。 所以我会写一个清晰的解释,以及需要注意的内容。

所有命令都将使用dotnet编写。

此解决方案是为 .net Core 3.1 提供的,但也应与所有其他代兼容

删除迁移:

删除迁移会从您的项目中删除文件(每个人都应该清楚) 只有在迁移未应用于数据库的情况下才能删除迁移 还 删除最后创建的迁移:cd to_your_project 然后dotnet ef migrations remove

注意:仅当您尚未执行 dotnet ef database update 或在您的 c# 代码中调用 Database.Migrate() 时,移除迁移才有效,换句话说,仅当迁移尚未应用于您的数据库时。

取消应用迁移(还原迁移):

从数据库中删除不需要的更改 不会从您的项目中删除迁移文件,但允许您在取消应用后将其删除 要恢复迁移,您可以: 创建一个新的迁移dotnet ef migrations add &lt;your_changes&gt; 并应用它,这是微软推荐的。 或者,使用dotnet ef database update &lt;your_migration_name_to_jump_back_to&gt; 将您的数据库更新到指定的迁移(基本上是取消应用或还原未选择的迁移)

注意:如果您要取消应用的迁移不包含特定的列或表,而这些列或表已在您的数据库中应用并正在使用,则该列或表将被删除,您的数据将丢失.

还原迁移后,您可以删除不需要的迁移

希望这对某人有所帮助!

【讨论】:

在您的最后一条注释中,我想您想说:“如果您在取消应用迁移后想要进行的目标迁移不包含...”或“如果您想要的迁移不适用,不包含"【参考方案13】:
dotnet ef database update <the-migration-you-want-to-recover>
dotnet ef migrations remove

不要忘记 remove-Call,因为这将为您删除迁移文件并更新快照文件。

【讨论】:

您的意思是database remove 还是migrations remove【参考方案14】:

首先运行以下命令:

PM>update-database -migration:0

然后运行这个:

PM>remove_migration

完成

【讨论】:

【参考方案15】:

要在 EF Core 1.0 中取消应用迁移,请使用以下命令:

dotnet ef 数据库更新 migration_name

使用您希望保留更改的迁移的迁移名称。可以使用以下命令找到迁移的名称列表:

dotnet ef 迁移列表

【讨论】:

【参考方案16】:

删除迁移

如果上次迁移未应用于数据库,您可以删除它。使用以下删除命令删除最后创建的迁移文件并恢复模型快照。

包管理器控制台

PM> 移除迁移

CLI> dotnet ef 迁移删除

上述命令将删除上一次迁移并将模型快照恢复为上一次迁移。请注意,如果迁移已应用于数据库,则会引发以下异常。

迁移已应用于数据库。还原它并重试。如果迁移已应用于其他数据库,请考虑使用新迁移恢复其更改。

恢复迁移

假设您更改了域类并使用 add-migration 命令创建了名为 MySecondMigration 的第二个迁移,并使用 Update 命令将此迁移应用于数据库。但是,出于某种原因,您希望将数据库恢复到以前的状态。在这种情况下,请使用 update-database 命令将数据库恢复到指定的先前迁移快照。

包管理器控制台

PM> 更新数据库 MyFirstMigration

CLI

dotnet ef 数据库更新 MyFirstMigration。

上述命令将基于名为 MyFirstMigration 的迁移还原数据库,并删除应用于名为 MySecondMigration 的第二个迁移的所有更改。这还将从数据库中的 __EFMigrationsHistory 表中删除 MySecondMigration 条目。

注意:这不会删除与 MySecondMigration 相关的迁移文件。使用 remove 命令将它们从项目中删除。

【讨论】:

【参考方案17】:

因为我已被重定向到此问题,以在 ef 而不是 ef core 中搜索回滚迁移,所以我将这个答案添加到每个想在 ef 中了解相同问题的人的问题中.如果您使用ef,您可以使用以下命令回滚迁移:

Update-Database [[-Migration] <String>] 
                [-Context <String>]
                [-Project <String>]
                [-StartupProject <String>] 
                [<CommonParameters>] 

基于问题:

Update-Database -Migration <previous-migration-name> -context BloggingContext

【讨论】:

【参考方案18】:

1.找到表“dbo._EFMigrationsHistory”,然后删除要删除的迁移记录。 2. 在 PM(Package Manager Console) 中运行“remove-migration”。 对我有用。

【讨论】:

这会导致数据库的状态不一致(例如一列已经被删除)【参考方案19】:

你可以这样做:

dotnet ef migrations remove

警告

注意不要删除任何已应用于生产数据库的迁移。不这样做会阻止您恢复它,并且可能会破坏后续迁移所做的假设。

【讨论】:

请不要重复答案,这没有用。 ***.com/a/55323154/861716

以上是关于如何使用 EF Core 在 ASP.NET Core 中取消应用迁移的主要内容,如果未能解决你的问题,请参考以下文章

ASP.Net Core 如何在 EF Core 和 Identity 中获取用户角色

如何使用 EF Core 代码优先迁移为 ASP.NET Core MVC 配置 N 层架构

如何在现有数据库 ASP.NET Core MVC 和 EF Core(DB-First)中使用 Identity

如何在不使用 EF 的情况下连接到 ASP.NET Core Web API 中的数据库?

带有 EF Core 更新实体的 ASP.Net 核心 Web Api 如何

ASP.NET Core 使用 EF Core