我使用EF 6.0为我的项目在c#手动迁移和更新。我在数据库上进行了大约5次迁移,但我意识到最后一次迁移很糟糕,我不想要它。我知道我可以回滚到以前的迁移,但是当我添加一个新的(固定的)迁移并运行Update-Database时,甚至应用了糟糕的迁移。
我试图回滚到以前的迁移,并删除迁移不良的文件。但是,当我尝试添加新的迁移时,我在更新数据库时得到错误,因为迁移文件已损坏(更具体地说,第一行代码将表A重命名为B,然后是下一行,EF正在尝试用名称A更新表-可能是一些EF错误)。
是否有一些查询,我可以运行,这将告诉EF类似“忘记上次迁移,就像它从来没有存在过,它是坏的”?类似于Remove-Migration。
Edit1
我找到了适合我的解决办法。将模型更改为良好状态并运行Add-Migration TheBadMigration -Force。这将重新构建最后一个未应用的迁移。
无论如何,这仍然没有完全回答最初的问题。如果我UpdateDatabase到坏的迁移,我没有找到好方法如何回滚和创建新的迁移,排除坏的一个。
谢谢
我使用EF核心与ASP。NET Core V2.2.6。@Richard Logwood的回答很棒,它解决了我的问题,但我需要一个不同的语法。
所以,对于那些使用EF核心与ASP。NET Core V2.2.6 +…
而不是
Update-Database <Name of last good migration>
我不得不使用:
dotnet ef database update <Name of last good migration>
而不是
Remove-Migration
我不得不使用:
dotnet ef migrations remove
我不得不求助:
dotnet ef migrations --help
Usage: dotnet ef migrations [options] [command]
Options:
-h|--help Show help information
-v|--verbose Show verbose output.
--no-color Don't colorize output.
--prefix-output Prefix output with level.
Commands:
add Adds a new migration.
list Lists available migrations.
remove Removes the last migration.
script Generates a SQL script from migrations.
Use "migrations [command] --help" for more information about a command.
这让我的角色回到我的DB按预期工作的阶段,并从头开始。
我使用EF核心与ASP。NET Core V2.2.6。@Richard Logwood的回答很棒,它解决了我的问题,但我需要一个不同的语法。
所以,对于那些使用EF核心与ASP。NET Core V2.2.6 +…
而不是
Update-Database <Name of last good migration>
我不得不使用:
dotnet ef database update <Name of last good migration>
而不是
Remove-Migration
我不得不使用:
dotnet ef migrations remove
我不得不求助:
dotnet ef migrations --help
Usage: dotnet ef migrations [options] [command]
Options:
-h|--help Show help information
-v|--verbose Show verbose output.
--no-color Don't colorize output.
--prefix-output Prefix output with level.
Commands:
add Adds a new migration.
list Lists available migrations.
remove Removes the last migration.
script Generates a SQL script from migrations.
Use "migrations [command] --help" for more information about a command.
这让我的角色回到我的DB按预期工作的阶段,并从头开始。
对于那些使用EF Core与ASP。NET Core v1.0.0我有一个类似的问题,并使用以下命令来纠正它(@DavidSopko的帖子为我指明了正确的方向,但EF Core的细节略有不同):
Update-Database <Name of last good migration>
Remove-Migration
例如,在我当前的开发中,命令变成
PM> Update-Database CreateInitialDatabase
Done.
PM> Remove-Migration
Done.
PM>
remove - migration将删除您应用的最后一次迁移。如果您有一个更复杂的场景,需要删除多个迁移(我只有2个,初始的和坏的),我建议您在一个虚拟项目中测试这些步骤。
目前EF Core (v1.0.0)中似乎没有Get-Migrations命令,因此您必须在migrations文件夹中查找并熟悉您所做的工作。然而,有一个很好的帮助命令:
PM> get-help entityframework
在VS2015 SQL Server对象资源管理器中刷新数据库,我所有的数据都被保留了,我想要恢复的迁移已经消失了:)
最初我尝试了Remove-Migration本身,发现错误命令令人困惑:
系统。InvalidOperationException:迁移'…’已经被
应用于数据库。取消应用,再试一次。如果迁移
已经应用到其他数据库,是否考虑恢复其更改
使用新的迁移。
已经有人提出了改进这一措辞的建议,但我希望错误是这样的:
运行Update-Database(最后一个良好的迁移名称)将数据库模式恢复到该状态。这个命令将
取消应用指定的迁移之后发生的所有迁移
- database就。然后您可以运行remove - migration(要删除的迁移名称)
EF Core help命令输出如下:
PM> get-help entityframework
_/\__
---==/ \\
___ ___ |. \|\
| __|| __| | ) \\\
| _| | _| \_/ | //|\\
|___||_| / \\\/\\
TOPIC
about_EntityFrameworkCore
SHORT DESCRIPTION
Provides information about Entity Framework Core commands.
LONG DESCRIPTION
This topic describes the Entity Framework Core commands. See https://docs.efproject.net for information on Entity Framework Core.
The following Entity Framework cmdlets are included.
Cmdlet Description
-------------------------- ---------------------------------------------------
Add-Migration Adds a new migration.
Remove-Migration Removes the last migration.
Scaffold-DbContext Scaffolds a DbContext and entity type classes for a specified database.
Script-Migration Generates a SQL script from migrations.
Update-Database Updates the database to a specified migration.
Use-DbContext Sets the default DbContext to use.
SEE ALSO
Add-Migration
Remove-Migration
Scaffold-DbContext
Script-Migration
Update-Database
Use-DbContext