如何在带有EF Core的ASP.NET Core中取消应用迁移


179

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

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。


3
尝试-force在末尾添加
勘探者


感谢@MichaelFreidgeim
Drewskis '18

Answers:


215

用:

命令行界面

> dotnet ef database update <previous-migration-name>

程序包管理器控制台

PM> Update-Database <previous-migration-name>

例:

PM> Update-Database MyInitialMigration

然后尝试删除上一次迁移。

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

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


6
我仍然遇到相同的错误。我首先使用dotnet ef database update MyFirstMigration --context BloggingContext成功的方法。然后我跑了dotnet ef migrations remove --context BloggingContext,给了我与我的帖子相同的错误消息
nam

14
您需要先更新到迁移MyFirstMigration。如果这是第一次迁移(顾名思义),则可以dotnet ef database update 0用来还原(取消应用)数据库中的所有迁移。然后,您应该可以运行了dotnet ef migrations remove
bvpb

另外值得注意的是,您只应使用迁移的名称,但不包括日期前缀
结构化

2
dotnet ef migrations remove在此之后致电
Chamika Sandamal

您的第二个陈述:“然后尝试删除最后一个迁移”在此答案中尚未完成,请准确说明您的意思。删除迁移文件?执行命令?...
S.Serpooshan

125

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

dotnet ef database update 0
dotnet ef migrations remove

1
但是您不想删除所有迁移。例如,您要保留VS为身份(用户帐户)创建的默认迁移,位于Data \ Migrations文件夹下。
2016年

知道这很高兴dotnet ef database update 0,但是dotnet ef migrations remove之后运行将删除Identity的默认迁移,而这可能是不希望的。
kimbaudi

谢谢你的提示dotnet ef database update 0!我从未在任何地方看到此事……
Tobias J

3
@nam“但是您不想删除所有迁移。” 但是我们当中有些人这样做。不要假设我想要的是:)
starmandeluxe

3
这对我不起作用。第一行还可以,删除所有迁移,第二行我仍然可以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.
Ido Ran

52

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

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

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


您可以Update-Database从Package Management Console进行调用dotnet ef database update,也可以从项目目录的命令提示符下进行调用。
kimbaudi

6
只是为了在这里澄清Brad的答案- <migration name>应该是您要返回的迁移的名称(即可能是搞砸之前的迁移),而不是要撤消的迁移的名称。
Mark Amery

52

要取消应用特定迁移

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
震惊

28

要还原上一次应用的迁移,您应该(程序包管理器控制台命令):

  1. 还原从数据库的迁移: PM> Update-Database <prior-migration-name>
  2. 从项目中删除迁移文件(否则将在下一步再次应用它)
  3. 更新模型快照: PM> Remove-Migration

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


1
谢谢!这工作完全着迷了这一点所有的解决方案,没有人提到需要第2步
迈克尔Kargl

是的,没人提到第二步。谢谢
Aju

不确定第二步,在我的情况下(最新VS2017),迁移文件将在调用后自动删除Remove-Migration而不会出现问题。我不确定您说的是“下一步将再次应用它”!
S.Serpooshan

@ S.Serpooshan确实。我手动删除了它,但是当我运行Remove-Migration时,它抱怨我以前的迁移已应用于数据库。但是,它有效。
MetalMikester

我认为只有在您致电dbContext.Database.Migrate()startup.cs时,才需要执行第二步
user3413723

23

您只需按价值定位迁移

 Update-Database -Migration:0

然后继续将其删除

 Remove-Migration

1
这对我有用,但是我将EF和.NET Core 2.0与VS2017结合使用
James Morrison

2
当心:-Migration:0表示返回到没有迁移状态。这将清除您的数据库
Kieren Johnstone '18

是的,根据提出的问题。您可以根据要回滚的迁移来增加值
John Nyingi

11

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

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

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

编码愉快!


21
这实际上不会取消应用迁移,只是使框架“认为”尚未应用。如果这样做,您的数据库将处于不一致状态。
mark.monteiro '17

手动编辑__EFMigrationsHistory中的数据是可怕的建议。不要这样 该表仅供迁移工具在后台使用。如果您开始手动编辑数据,那么一个错误就会在项目中造成各种疯狂的意外行为。使用其他推荐的解决方案之一是一个更好的主意。
Joe Irby

我们遇到的情况是,一个初级团队成员对切换分支感到困惑,并最终从这两个分支中手动删除了迁移(尽管由于已经被应用,它仍然在__EFMigrationsHistory表中),所以我们失去了“失败”的机会。这就是我们最终要做的,再加上SSMS中的一些手动冲销。因此,请勿执行此操作-除非此时您别无选择。至少他所做的只是添加一个新字段。
艾拉


10

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

否则,此命令将删除迁移并删除迁移文件夹:

   > remove-migration -force

7

通常,如果您使用的是Package Manager控制台,则删除特定迁移的正确方法是参考迁移的名称

Update-Database -Migration {Name of Migration} -Context {context}

删除根据文档应用的最后一次迁移的另一种方法是使用以下命令:

dotnet ef migrations remove

此命令应从解决方案目录中的开发人员命令提示符(如何打开命令提示符)执行。

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

C:\Projects\Application

1
问题是如果“ dotnet ef migrations remove”返回错误“该迁移已被应用到数据库”,该怎么办
Michael Freidgeim,

2

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

dotnet ef数据库更新{migration_name}

使用要保留更改的迁移名称。可以使用以下方式找到迁移名称的列表:

dotnet ef迁移列表


2

要还原所有应用于数据库的迁移,只需运行:

update-database 0

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



0
var context = serviceProvider.GetRequiredService<ApplicationDbContext>();
var userManager = serviceProvider.GetRequiredService<UserManager<ApplicationUser>>();
var roleManaget = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();

await context.Database.EnsureDeletedAsync();

-1

1.找到表“ dbo._EFMigrationsHistory”,然后删除要删除的迁移记录。2.在PM(Package Manager控制台)中运行“删除迁移”。为我工作。


这将导致数据库状态不一致(例如,某列已被删除)
UNeverNo
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.