Entity Framework:如何生成迁移修改外键约束的删除行为
修改外键删除行为无需回滚旧迁移的实现方法
完全不用回滚之前的大量迁移,直接创建新迁移就能修改这个外键的onDelete行为,具体操作分两种情况:
1. 自动生成迁移(优先推荐)
要是你用的是EF Core,先在实体模型配置里把对应外键的删除行为改成NoAction:
- 用Fluent API的话,找到该外键的配置代码,把
.OnDelete(ReferentialAction.Cascade)替换成.OnDelete(ReferentialAction.NoAction) - 用数据注解的话,调整对应关系的注解配置
然后执行生成迁移的命令:
# Visual Studio的Package Manager Console Add-Migration UpdateGameConditionForeignKeyOnDelete # .NET CLI dotnet ef migrations add UpdateGameConditionForeignKeyOnDelete
EF Core会自动识别出外键约束的变更,生成对应的迁移代码,里面包含删除原有外键、创建新的onDelete为NoAction的外键约束的逻辑。
2. 手动创建迁移(自动生成失效时用)
如果自动生成没检测到变更,或者你需要精准控制,可以手动创建:
- 先生成一个空的迁移类:
# Package Manager Console Add-Migration UpdateGameConditionForeignKeyOnDelete -Empty # .NET CLI dotnet ef migrations add UpdateGameConditionForeignKeyOnDelete --empty
- 打开生成的迁移类,在
Up方法里添加修改外键的代码:
protected override void Up(MigrationBuilder migrationBuilder) { // 删除原外键约束 migrationBuilder.DropForeignKey( name: "FK_GameConditionCombinations_GameConditions_GameCondition1Id", table: "GameConditionCombinations"); // 创建新的外键约束,设置onDelete为NoAction migrationBuilder.AddForeignKey( name: "FK_GameConditionCombinations_GameConditions_GameCondition1Id", table: "GameConditionCombinations", column: "GameCondition1Id", principalTable: "GameConditions", principalColumn: "GameConditionId", onDelete: ReferentialAction.NoAction); }
- 可以在
Down方法里写回滚逻辑,方便后续恢复:
protected override void Down(MigrationBuilder migrationBuilder) { migrationBuilder.DropForeignKey( name: "FK_GameConditionCombinations_GameConditions_GameCondition1Id", table: "GameConditionCombinations"); migrationBuilder.AddForeignKey( name: "FK_GameConditionCombinations_GameConditions_GameCondition1Id", table: "GameConditionCombinations", column: "GameCondition1Id", principalTable: "GameConditions", principalColumn: "GameConditionId", onDelete: ReferentialAction.Cascade); }
最后执行迁移命令把变更应用到数据库:
# Package Manager Console Update-Database # .NET CLI dotnet ef database update
内容的提问来源于stack exchange,提问作者user517406
相关产品推荐
相关产品推荐

