这看起来像是一个非常常见的任务,但我找不到一个简单的方法来做到这一点。
我想撤消上次应用的迁移。我本来期望一个简单的命令,比如
PM> Update-Database -TargetMigration:"-1"
相反,我能想到的是:
PM> Get-Migrations
Retrieving migrations that have been applied to the target database.
201208012131302_Add-SystemCategory
201207311827468_CategoryIdIsLong
201207232247409_AutomaticMigration
201207211340509_AutomaticMigration
201207200025294_InitialCreate
PM> Update-Database -TargetMigration:"CategoryIdIsLong"
(至少我可以只使用名称,跳过时间戳......)
有没有更简单的方法?
我想对该线程添加一些说明:
Update-Database -TargetMigration:"name_of_migration"
您在上面所做的是说您想要回滚所有迁移,直到您留下指定的迁移。因此,如果您使用 GET-MIGRATIONS 并发现您有 A、B、C、D 和 E,那么使用此命令将回滚 E 和 D 以将您带到 C:
Update-Database -TargetMigration:"C"
此外,除非有人可以提出相反的意见,否则我注意到您可以使用序数值和短的 -Target 开关(因此,-Target 与 -TargetMigration 相同)。如果要回滚所有迁移并重新开始,可以使用:
Update-Database -Target:0
0,上面,甚至会回滚第一次迁移(这是一个破坏性的命令——确保你在使用它之前知道你在做什么!)——如果你使用上面需要名称的语法,你不能做的事情目标迁移(在应用迁移之前,第 0 个迁移的名称不存在!)。因此,在这种情况下,您必须使用 0(序数)值。同样,如果您已应用迁移 A、B、C、D 和 E(按此顺序),则序数 1 应引用 A,序数 2 应引用 B,依此类推。所以要回滚到 B 你可以使用:
Update-Database -TargetMigration:"B"
或者
Update-Database -TargetMigration:2
2019 年 10 月编辑:
根据this related answer on a similar question,EF Core 1.1 的正确命令是 -Target
,而 EF Core 2.0 的正确命令是 -Migration
。
从 EF 5.0 开始,您描述的方法是首选方式。所以
PM> Update-Database -TargetMigration:"NameOfSecondToLastMigration"
或使用您的示例迁移
PM> Update-Database -TargetMigration:"CategoryIdIsLong"
一种解决方案是创建一个自动执行上述步骤的包装 PS 脚本。此外,请随意为此创建功能请求,或者更好的是,尝试实现它! https://github.com/dotnet/ef6
在 EntityFrameworkCore 中:
Update-Database 20161012160749_AddedOrderToCourse
其中 20161012160749_AddedOrderToCourse
是您要回滚到的迁移名称。
我意识到使用 CLI dotnet
命令没有任何好的解决方案,所以这里有一个:
dotnet ef migrations list
dotnet ef database update NameOfYourMigration
在 NameOfYourMigration
的位置输入您要恢复到的迁移的名称。
然后,您可以删除所有恢复的迁移,以便使用
dotnet ef migrations remove
解决方案是:
Update-Database –TargetMigration 201609261919239_yourLastMigrationSucess
英孚核心
PM> Update-Database yourMigrationName
(恢复迁移)
PM> Update-Database
为我工作
在这种情况下,原始问题(yourMigrationName = CategoryIdIsLong)
在 EF Core 中,您可以在添加错误迁移后在包管理器控制台中输入命令 Remove-Migration
。
如果您的迁移可能涉及数据丢失,控制台建议您这样做:
搭建了一个可能导致数据丢失的操作。请检查迁移的准确性。要撤消此操作,请使用 Remove-Migration。
update-database 0
警告:这将回滚 EFCore 中的所有迁移!请小心使用:)
额外提醒:
如果您有多个配置类型,则需要指定 [ConfigurationName]
Update-Database -Configurationtypename [ConfigurationName] -TargetMigration [MigrationName]
我通过我的 (BASH GIT) 控制台 运行我的,也运行 Entity Framework Core。 Update-Database
命令在软件包控制台之外不起作用,我必须使用 donet ef
命令。
donet ef database update [Name of previous Migration]
这将运行您当前迁移的 protected override void Down(MigrationBuilder migrationBuilder)
方法和所有其他方法,以返回您设置的数据库版本。
我也使用 -p [migration project]
-s [Project Solution]
。这也允许它指向我的 appsettings.[Enviorment].json 存储我访问数据库的密码的位置。
export ASPNETCORE_ENVIRONMENT=[ENVIORMENT]; donet ef database update [Name of previous Migration] -p [Migration Project Name] -s [Solution Name]
其中很多可能是已知的,但如果您第一次这样做,希望提供详细信息。
英孚核心
将数据库更新到上一点
update-database CategoryIdIsLong
然后,删除不良迁移
remove-migration
我正在使用 EntityFrameworkCore 并使用@MaciejLisCK 的答案。如果您有多个数据库上下文,您还需要通过添加上下文参数来指定上下文,例如:
Update-Database 201207211340509_MyMigration -context myDBcontext
(其中 201207211340509_MyMigration
是您要回滚到的迁移,myDBcontext
是您的数据库上下文的名称)
Update-Database –TargetMigration:"Your migration name"
对于这个问题,我建议这个链接:
https://elegantcode.com/2012/04/12/entity-framework-migrations-tips/
我发现这在包管理器控制台中运行时有效:
dotnet ef migrations list | select -Last 2 | select -First 1 | ForEach-Object { Update-Database -Migration $_ }
您可以创建一个脚本,使其更容易。
如果有数据丢失的可能性,EF 不会完成 update-database 命令,因为默认情况下 AutomaticMigrationDataLossAllowed = false,并且会回滚操作,除非您使用 -force 参数运行它。
Update-Database –TargetMigration:"Your migration name" -force
或者
Update-Database –TargetMigration:Your_Migration_Index -force
$InitialDatabase
。ls variable:*
看起来$InitialDatabase
只是一个定义为 0 的 PowerShell 变量,没有定义任何其他变量,即使在当前的 EF 源代码。而且,get-migrations 不会返回任何内容,它只会写入控制台,因此您无法遍历返回的对象......