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

时间:2016-07-04 21:29:51

标签: c# asp.net-core entity-framework-core .net-core visual-studio-2015

使用EF Core在VS2015中使用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.

20 个答案:

答案 0 :(得分:138)

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

然后尝试删除上次迁移。

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

答案 1 :(得分:91)

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

dotnet ef database update 0
dotnet ef migrations remove

答案 2 :(得分:45)

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

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

但是,根据您的迁移名称判断,我认为它是第一次迁移,因此该命令可能无效。您应该能够从数据库中的__MigrationHistory表中删除该条目,然后再次运行Remove-Migration命令。您也可以删除迁移文件,然后重新开始。

答案 3 :(得分:20)

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

  1. 从数据库恢复迁移:PM> Update-Database <prior-migration-name>
  2. 从项目中删除迁移文件(或者将在下一步重新应用)
  3. 更新模型快照:PM> Remove-Migration
  4. <强> UPD : 在最新版本的Visual Studio(2017)中似乎不需要第二步。

答案 4 :(得分:17)

只需按价值定位迁移

即可
 Update-Database -Migration:0

然后继续删除它

 Remove-Migration

答案 5 :(得分:15)

To&#34; unapply&#34;它已经应用于数据库之后的最多(最近?)迁移:

  1. 打开SQL Server对象资源管理器(查看 - &gt;&#34; SQL Server对象资源管理器&#34;)
  2. 通过将小三角形展开到侧面,导航到链接到项目的数据库。
  3. 展开&#34;表格&#34;
  4. 找到名为&#34; dbo._EFMigrationsHistory&#34;。
  5. 的表格
  6. 右键单击它并选择&#34;查看数据&#34;在Visual Studio中查看表条目。
  7. 删除与您要取消应用的迁移相对应的行(如果出现提示,请说明&#34;是&#34;警告)。
  8. 运行&#34; dotnet ef迁移删除&#34;再次在具有project.json文件的目录的命令窗口中。或者,运行&#34; Remove-Migration&#34;包管理器控制台中的命令。
  9. 希望这会有所帮助并且适用于项目中的任何迁移......我仅对最近的迁移进行了测试...

    快乐的编码!

答案 6 :(得分:8)

在软件包管理器控制台中:

Update-Database Your_Migration_You_Want_To_Revert_To

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

答案 7 :(得分:7)

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

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

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

dotnet ef migrations remove

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

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

C:\Projects\Application

答案 8 :(得分:6)

  

您应该从以下位置删除迁移记录'20160703192724_MyFirstMigration'记录    “ _EFMigrationsHistory”表。

     

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

   > remove-migration -force

答案 9 :(得分:4)

要取消应用特定迁移

dotnet ef database update <previous-migration-name>
or
PM> Update-Database -Migration <previous-migration-name>

要取消应用所有迁移

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

要删除上一次迁移:

dotnet ef migrations remove
or
PM> Remove-Migration

要取消应用并删除上一个迁移,

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

答案 10 :(得分:4)

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

update-database 0

在运行Remove-Migration之后,应运行<td class="cell-icon"> <a class="type-icon type-grass" href="/type/grass">Grass</a><br> <a class="type-icon type-poison" href="/type/poison">Poison</a> </td> 的次数与“迁移”目录中可见的迁移文件的次数相同。该命令将删除最新的迁移并更新快照。

答案 11 :(得分:3)

dotnet ef database update <the-migration-you-want-to-recover>
dotnet ef migrations remove

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

答案 12 :(得分:2)

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

dotnet ef数据库更新{migration_name}

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

dotnet ef迁移列表

答案 13 :(得分:2)

此处有更多详细信息和解决方案:

我不明白为什么我们在这里混淆了事情。 所以我会写下一个清晰的解释,以及必须注意的内容。

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

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

移除迁移:

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

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

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

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

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

恢复迁移后,您可以删除不需要的迁移

希望这对某人有所帮助!

答案 14 :(得分:1)

首先运行以下命令:

PM>update-database -migration:0

然后运行这个:

PM>remove_migration

完成

答案 15 :(得分:0)

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

await context.Database.EnsureDeletedAsync();

答案 16 :(得分:-1)

1.find table“dbo._EFMigrationsHistory”,然后删除要删除的迁移记录。 2.在PM(包管理器控制台)中运行“remove-migration”。 适合我。

答案 17 :(得分:-1)

在Package Manager控制台中,只需键入 Remove-Migration (删除迁移),然后按Enter。 它会自动删除迁移。

工具-> Nuget软件包管理器->软件包管理器控制台

答案 18 :(得分:-1)

你可以这样做:

dotnet ef migrations remove

警告

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

答案 19 :(得分:-2)

  1. 从先前成功迁移的 down()方法的主体中复制代码。
  2. 使用Add-Migration "migration-name"
  3. 添加新的迁移
  4. 将复制的代码从先前迁移的down()方法粘贴到新迁移的 Up()方法中:
    Up(){ //paste here }
  5. 运行Update-Database
  6. 完成,您对上一次迁移的更改现在应该已还原!