这看起来是一项非常常见的任务,但我找不到一种简单的方法。
我想撤消上次应用的迁移。我本来期待一个简单的命令,比如
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"
(至少我只能使用名称,跳过时间戳......)
有更简单的方法吗?
答案 0 :(得分:354)
我想在这个帖子中添加一些说明:
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
根据类似问题的相关answer,正确的参数名称为-Target
(对于EF Core 1.1)或-Migration
(对于EF Core 2.0)
答案 1 :(得分:133)
从EF 5.0开始,您描述的方法是首选方法。一种解决方案是创建一个自动执行上述步骤的包装PS脚本。此外,您可以随意创建功能请求,或者更好地实现它! http://entityframework.codeplex.com/
答案 2 :(得分:58)
在 EntityFrameworkCore :
中Update-Database 20161012160749_AddedOrderToCourse
其中20161012160749_AddedOrderToCourse
是您要回滚的迁移名称。
答案 3 :(得分:11)
解决方案是:
Update-Database –TargetMigration 201609261919239_yourLastMigrationSucess
答案 4 :(得分:6)
我意识到利用CLI dotnet
命令并没有什么好的解决方案,所以这是一个:
dotnet ef migrations list
dotnet ef database update NameOfYourMigration
在NameOfYourMigration
处,输入要还原到的迁移的名称。
答案 5 :(得分:3)
补充提醒:
如果您有多种配置类型,则需要指定[ConfigurationName]
Update-Database -Configurationtypename [ConfigurationName] -TargetMigration [MigrationName]
答案 6 :(得分:1)
在EF Core中,添加错误迁移后,您可以在包管理器控制台中输入命令Remove-Migration
。
如果迁移可能会导致数据丢失,则控制台建议您这样做:
脚手架操作可能会导致数据丢失。 请检查迁移的准确性。要撤消此操作,请使用 删除迁移。
答案 7 :(得分:1)
update-database 0
This will roll back all migrations in EFCore
答案 8 :(得分:1)
Update-Database –TargetMigration:"Your migration name"
对于这个问题,我建议使用此链接:
https://elegantcode.com/2012/04/12/entity-framework-migrations-tips/
答案 9 :(得分:1)
我发现在“程序包管理器控制台”中运行时可以正常工作:
dotnet ef migrations list | select -Last 2 | select -First 1 | ForEach-Object { Update-Database -Migration $_ }
您可以创建一个使它更容易的脚本。
答案 10 :(得分:1)
EF CORE
PM> Update-Database yourMigrationName
(还原迁移)
PM> Update-Database
为我工作
在这种情况下,原始问题 (yourMigrationName = CategoryIdIsLong)
答案 11 :(得分:0)
我正在使用 EntityFrameworkCore ,并且使用@MaciejLisCK的答案。如果您有多个数据库上下文,则还需要通过添加上下文参数来指定上下文,例如:
Update-Database 201207211340509_MyMigration -context myDBcontext
(其中201207211340509_MyMigration
是您要回滚的迁移,而myDBcontext
是您的数据库上下文的名称)
答案 12 :(得分:0)
万一有数据丢失的可能,由于默认情况下EF因为AutomaticMigrationDataLossAllowed = false而没有完成update-database命令,因此除非使用 -force 参数运行该操作,否则该操作将回滚。
Update-Database –TargetMigration:"Your migration name" -force
或
Update-Database –TargetMigration:Your_Migration_Index -force
答案 13 :(得分:0)
我通过我的(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]
其中很多可能是已知的,但希望提供详细信息,以防您第一次这样做。
答案 14 :(得分:0)
EF 核心
更新数据库到上一点
test
然后,删除错误的迁移
testTwo