正如问题所指出的,这适用于尚未发布的开发类型环境中的迁移。
这个问题可以通过以下步骤来解决:
将数据库恢复到上一次良好的迁移。
从实体框架项目中删除糟糕的迁移。
生成一个新的迁移并将其应用到数据库。
注意:实体框架和实体框架核心使用的命令名称略有不同
步骤1:恢复到以前的迁移
如果您还没有应用迁移,可以跳过这一部分。要将数据库模式恢复到前一点,发出Update-Database命令,并带有-TargetMigration选项,以指定最后一次良好迁移。对于EFCore使用Update-Database "Name-of-Migration"
如果您的实体框架代码位于解决方案中的不同项目中,则可能需要使用“-Project”选项或在包管理器控制台中切换默认项目。
Update-Database –TargetMigration: <name of last good migration>
对于EFCore:
Update-Database <name of last good migration>
要获得最后一次良好迁移的名称,使用' get - migrations '命令检索已应用到数据库的迁移名称列表,如果使用EFCore,则使用' get - migration '不带's'。
PM> Get-Migrations
Retrieving migrations that have been applied to the target database.
201508242303096_Bad_Migration
201508211842590_The_Migration_applied_before_it
201508211440252_And_another
这个列表首先显示了最近应用的迁移。选择列表中发生在您想要降级到的迁移之后的迁移,即应用在您想要降级的迁移之前的迁移。现在发出一个Update-Database。
Update-Database –TargetMigration: "<the migration applied before it>"
对于EFCore:
Update-Database "<the migration applied before it>"
在指定的迁移之后应用的所有迁移都将按照从最先应用的最新迁移开始的顺序降级。
如果您的降级可能导致数据丢失,EF将拒绝该命令。使用'-Force'选项接受数据丢失并允许命令执行。
步骤2:从项目中删除迁移
如果您正在使用实体框架核心,您可以使用'remove-migration'命令,对于实体框架,手动删除EF项目'Migrations'文件夹中不需要迁移的文件。此时,您可以自由地创建一个新的迁移并将其应用到数据库。
对于EFCore:
remove-migration name_of_bad_migration
步骤3:添加新的迁移
add-migration my_new_migration
步骤4:将迁移应用到数据库
update-database