.NET对接MySQL删除empresas数据外键约束失败报错如何解决?
错误原因
该报错是由于待删除的empresa主表记录存在关联的qsa从表数据,外键约束默认禁止直接删除主表数据,避免从表出现无主的外键字段。
解决方案(级联删除,适合Qsa数据随Empresa一同删除的业务场景)
- 补全Qsa模型的关联字段,匹配数据库中已存在的外键关系
public class Qsa { [Key] public string Nome { get; set; } public string Qual { get; set; } // 新增外键字段,对应数据库里的EmpresaCnpj public string EmpresaCnpj { get; set; } // 配置外键关联 [ForeignKey(nameof(EmpresaCnpj))] public Empresa Empresa { get; set; } }
- 调整DbContext配置,开启级联删除
取消原有注释的代码,将删除行为从Restrict改为Cascade:
public class MyDbContext : DbContext { public MyDbContext(DbContextOptions<MyDbContext> options) : base(options) { Database.EnsureCreated(); } public DbSet<Empresa> Empresa { get; set; } // 取消Qsa DbSet的注释 public DbSet<Qsa> Qsa { get; set; } //public DbSet<Atividade> Atividade { get; set; } // 取消OnModelCreating的注释 protected override void OnModelCreating(ModelBuilder modelBuilder) { foreach (var foreignKey in modelBuilder.Model.GetEntityTypes().SelectMany(e => e.GetForeignKeys())) { // 将Restrict改为Cascade开启级联删除 foreignKey.DeleteBehavior = DeleteBehavior.Cascade; } base.OnModelCreating(modelBuilder); } }
- 修改删除逻辑,提前加载关联的Qsa数据,触发EF Core的级联删除逻辑
var empresa = await _context.Empresa // 加载关联的Qsa数据 .Include(e => e.Qsa) .FirstOrDefaultAsync(e => e.Cnpj == id);
修改完成后执行EF Core迁移命令更新数据库,配置即可生效。
可选方案(手动删除关联数据,无需修改全局删除规则)
如果不想开启全局级联删除,可以在删除Empresa前手动删除关联的Qsa记录:
if (empresa == null) { TempData["msg"] = "Este CNPJ não está cadastrado"; return RedirectToAction("Delete"); } // 先删除所有关联的Qsa数据 var relatedQsa = _context.Qsa.Where(q => q.EmpresaCnpj == id); _context.Qsa.RemoveRange(relatedQsa); // 再删除Empresa记录 _context.Empresa.Remove(empresa); await _context.SaveChangesAsync();
内容的提问来源于stack exchange,提问作者Kaike
相关产品推荐
相关产品推荐

