如何取消应用在ASP.NET核心迁移与EF核心

问题描述:

当我在VS2015运行PM> Remove-Migration -context BloggingContext使用EF核心,我得到以下错误的ASP.NET核心项目:如何取消应用在ASP.NET核心迁移与EF核心

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 1.0的核心,EF Core和VS2015更新3

+0

尝试加入'-force'在结束 – prospector

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

然后尝试删除最后一个迁移的最新版本。

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

+2

我仍然收到相同的错误。我第一次使用'dotnet ef数据库更新MyFirstMigration --context BloggingContext'成功地工作。然后我运行'dotnet ef migrations remove --context BloggingContext',它给了我和我的文章 – nam

+5

相同的错误信息。您需要在'MyFirstMigration'之前更新迁移。如果这是第一次迁移(顾名思义),那么您可以使用'dotnet ef database update 0'来恢复(不应用)来自数据库的所有迁移。你应该可以运行'dotnet ef migrations remove'。 – bvpb

+0

另外值得注意的是,您应该只使用迁移的名称,不包括日期前缀 – Structed

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

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

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

+0

您可以从程序包管理控制台调用Update-Database或从项目目录的命令提示中调用dotnet ef database update 。 – kimbaudi

+3

为了澄清Brad的答案 - “迁移名称”应该是您想要迁移回迁移的名称(也就是说,您可能会在迁移之前将其迁移),而不是迁移的名称你想撤消。 –

要完全删除所有迁移和从头再来,请执行下列操作:

dotnet ef database update 0 
dotnet ef migrations remove 
+0

但是你不想删除所有的迁移。例如,您想保留VS为Data \ Migrations文件夹下的标识(用户帐户)创建的默认迁移。 – nam

+0

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

+0

感谢您对'dotnet ef数据库更新0'的提示!我没有在任何地方看到这个...... –

要“不应用”最(近?)迁移后,它已经被应用到数据库:

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

希望这有助于和适用于项目中的任何迁移......我测试了这一点只是到最近的迁移......

编码愉快!

+2

这实际上并不适用迁移,只是让框架“认为”它没有被应用。如果你这样做,你的数据库将处于不一致的状态。 –

要删除已根据docs使用命令应用上次迁移:

dotnet ef migrations remove 

这个命令应该从解决方案目录内的显影剂命令提示符(how to open command prompt)执行。

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

C:\Projects\Application 

为了不应用在EF核心迁移1.0使用命令:

DOTNET EF数据库更新{migration_name}

使用迁移的迁移名字直到您希望保留您的更改。

DOTNET EF迁移列表

在包管理器控制台:迁移的名称的列表可以使用发现

Update-Database Your_Migration_You_Want_To_Revert_To

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