Entity Framework中更新现有迁移及删除指定非最新迁移的方法
EF Core迁移修改与删除问题解答
场景说明
我创建了一个名为Agreement的Migration类,用于向dbo.user和dbo.link_role_permission表插入数据,代码如下:
public partial class Agreement : Migration { protected override void Up(MigrationBuilder migrationBuilder) { migrationBuilder.InsertData( schema: "dbo", table: "user", columns: new[] { "id", "description", "name"}, values: new object[] { 69,"agreement-accept","accept" }); migrationBuilder.InsertData( schema: "dbo", table: "link_role_permission", columns: new[] { "role_id", "permission_id"}, values: new object[] {8,79 }); } protected override void Down(MigrationBuilder migrationBuilder) { } } }
现在我想修改插入到user表中的description值,有两个问题:
- 是否可以直接更新现有迁移?
- 如果需要删除该迁移并新建,如何删除这个非最新的指定迁移?我尝试了以下
Remove-Migration命令均无效,该迁移的类名为Agreement,文件名为20220826185818_Agreement:
Remove-Migration "20220826185818_Agreement" -Force Remove-Migration "Agreement" -Force" Remove-Migration 20220826185818_Agreement -Force Remove-Migration Agreement -Force
问题解答
1. 是否可以直接更新现有迁移?
- 若该迁移未被应用到数据库(未执行过
Update-Database),可以直接修改迁移类代码,保存后即可生效,无需额外操作。 - 若该迁移已被应用到数据库,禁止直接修改现有迁移文件:这会导致本地迁移记录与数据库
__EFMigrationsHistory表记录不一致,后续迁移操作会触发冲突。此时建议新建迁移添加UpdateData操作来修改数据,或者回滚迁移后再修改原文件。
2. 如何删除非最新的指定迁移?
Remove-Migration仅能删除最新的未应用迁移,无法直接删除中间的旧迁移,需按以下步骤手动操作:
- 回滚迁移状态:若目标迁移及后续迁移已应用到数据库,需先执行
Update-Database <目标迁移的上一个迁移名称>,回滚到目标迁移之前的状态。例如要删除20220826185818_Agreement,需回滚到它的前一个迁移:Update-Database 20220826xxxxxx_PreviousMigrationName - 删除本地文件:手动移除项目中对应的迁移文件(
20220826185818_Agreement.cs和20220826185818_Agreement.Designer.cs)。 - 清理数据库记录:打开数据库的
__EFMigrationsHistory表,删除该迁移对应的记录(若之前已应用)。 - 检查依赖:若目标迁移之后还有其他迁移,需确认这些迁移是否依赖目标迁移中的对象(插入数据类迁移通常无依赖),避免编译错误。
注意:若目标迁移之后有已应用的迁移,回滚和删除操作复杂度较高,优先推荐新建迁移修改数据,而非删除旧迁移。
内容的提问来源于stack exchange,提问作者Alma
相关产品推荐
相关产品推荐

