EF Core 中禁用级联删除最稳妥的方式是全局统一设为 DeleteBehavior.Restrict,它在主表记录被引用时抛出异常,且需同步修改迁移文件中的 onDelete 选项。
EF Core 默认会在某些关系(如必选外键)中启用级联删除,这可能导致意外删除大量关联数据。禁用它不难,关键是统一、明确地控制所有外键的行为,而不是靠删导航属性或改数据库。
最常用也最稳妥的方式是在 OnModelCreating 中遍历所有外键,强制设为 DeleteBehavior.Restrict:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
foreach (var fk in modelBuilder.Model.GetEntityTypes().SelectMany(e => e.GetForeignKeys()))
{
fk.DeleteBehavior = DeleteBehavior.Restrict;
}
}
如果只希望禁用特定一对关系的级联(比如 Department 和 Instructor),可在 Fluent API 中精准设置:
asOne 或 HasMany 配置链末尾加 OnDelete(DeleteBehavior.Restrict)
modelBuilder.Entity() .HasOne(d => d.Instructor) .WithMany() .HasForeignKey(d => d.InstructorId) .OnDelete(DeleteBehavior.Restrict);
这两个行为容易混淆,实际效果不同:
如果你已有生成好的迁移,其中外键定义含 CASCADE,光改代码不够:
ForeignKey 定义,把 onDelete: ReferentialAction.Cascade 改成 onDelete: ReferentialAction.Restrict
dotnet ef migrations add FixCascade 确保新迁移不含级联基本上就这些。核心就一条:用 Restrict 替代默认行为,并确保代码和迁移一致。不复杂但容易忽略迁移层。