62

當我在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

回答

75

使用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

28

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

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

但是,遷移的名稱來看我假設它是第一個遷移,這樣的命令可能無法正常工作。您應該能夠從數據庫中的__MigrationHistory表中刪除條目,然後再次運行Remove-Migration命令。您也可以刪除遷移文件並重新開始。

+0

您可以從程序包管理控制檯調用Update-Database或從項目目錄的命令提示中調用dotnet ef database update 。 – kimbaudi

+3

爲了澄清Brad的答案 - 「遷移名稱」應該是您想要遷移回遷移的名稱(也就是說,您可能會在遷移之前將其遷移),而不是遷移的名稱你想撤消。 –

45

要完全刪除所有遷移和從頭再來,請執行下列操作:

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'的提示!我沒有在任何地方看到這個...... –

14

要「不應用」最(近?)遷移後,它已經被應用到數據庫:

  1. 打開SQL Server對象資源管理器(查看 - >「SQL Server對象資源管理器」)
  2. 通過將小三角形展開到側面,導航到鏈接到項目的數據庫。
  3. 展開「表」
  4. 找到名爲「dbo._EFMigrationsHistory」的表。
  5. 右鍵單擊它並選擇「查看數據」以查看Visual Studio中的表條目。
  6. 刪除與您希望取消應用的遷移相對應的行(如果提示,請對該警告說「是」)。
  7. 在具有project.json文件的目錄中的命令窗口中再次運行「dotnet ef migrations remove」。或者,在軟件包管理器控制檯中運行「Remove-Migration」命令。

希望這有助於和適用於項目中的任何遷移......我測試了這一點只是到最近的遷移......

編碼愉快!

+2

這實際上並不適用遷移,只是讓框架「認爲」它沒有被應用。如果你這樣做,你的數據庫將處於不一致的狀態。 –

3

要刪除已根據docs使用命令應用上次遷移:

dotnet ef migrations remove 

這個命令應該從解決方案目錄內的顯影劑命令提示符(how to open command prompt)執行。

例如,如果您的應用程序名稱爲「Application」,並位於文件夾c:\ Projects中。那麼你的路徑應該是:

C:\Projects\Application 
1

爲了不應用在EF核心遷移1.0使用命令:

DOTNET EF數據庫更新{migration_name}

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

DOTNET EF遷移列表