能否通过EF Core配置外键的ON UPDATE行为?
能否通过EF Core配置外键的ON UPDATE行为?
首先直接给结论:EF Core 目前没有提供官方的流畅API或数据注解特性来配置外键的ON UPDATE行为。
为什么没有这个配置入口?
EF Core的设计逻辑里,主键被视为记录的不可变唯一标识,官方认为主键更新是非常少见的场景,因此没有在上层API中暴露ON UPDATE行为的配置入口。默认情况下,EF Core生成的外键约束ON UPDATE行为是NO ACTION,这也是绝大多数数据库的默认行为。
可行的解决方案:手动修改迁移代码
虽然没有上层配置方式,但你完全可以像你发现的那样,直接在生成的迁移代码里修改onUpdate参数的值,来指定你需要的行为。比如:
migrationBuilder.CreateTable( name: "Child", columns: table => new { Id = table.Column<Guid>(nullable: false), ParentId = table.Column<Guid>(nullable: false) }, constraints: table => { table.PrimaryKey("PK_Child", x => x.Id); table.ForeignKey( name: "FK_Child_Parent_ParentId", column: x => x.ParentId, principalTable: "Parent", principalColumn: "Id", // 手动修改onUpdate行为为级联更新 onUpdate: ReferentialAction.Cascade, onDelete: ReferentialAction.Cascade); });
注意事项
- 不同数据库对
ON UPDATE行为的支持存在差异,比如SQL Server对主键更新本身有严格限制,即使配置了级联更新,也可能因为主键被其他依赖约束限制而无法执行。 - 修改迁移代码后,执行迁移时会将这个配置应用到数据库中,后续自动生成的迁移不会覆盖你手动修改的设置(除非你重新生成整个迁移文件)。
内容的提问来源于stack exchange,提问作者Bokoskokos
相关产品推荐
相关产品推荐

