【问题标题】:Cannot delete or update a parent row: a foreign key constraint fails - .NET - Mysql无法删除或更新父行:外键约束失败 - .NET - Mysql
【发布时间】:2021-09-17 18:30:33
【问题描述】:

我在尝试从数据库中删除“empresas”时遇到此错误

MySqlException: 无法删除或更新父行:外键约束失败 (utproject1.qsa, CONSTRAINT FK_Qsa_Empresa_EmpresaCnpj FOREIGN KEY (EmpresaCnpj) REFERENCES empresa (Cnpj))

DbUpdateException:更新条目时出错。有关详细信息,请参阅内部异常。

在控制器中

        // POST: Empresas/Delete/cnpj
    [HttpPost, ActionName("Delete")]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> DeleteConfirmed(Empresa emp)
    {
        string id = emp.Cnpj;

        id = RemovePontuacao.RmPontCnpj(id);
        var empresa = await _context.Empresa.FindAsync(id);

        if (empresa == null)
        {
            TempData["msg"] = "Este CNPJ não está cadastrado";
            return RedirectToAction("Delete");
        }
        _context.Empresa.Remove(empresa);
        await _context.SaveChangesAsync();
        return RedirectToAction(nameof(Index));
    }

    private bool EmpresaExists(string id)
    {
        return _context.Empresa.Any(e => e.Cnpj == id);
    }

企业模式

public class Empresa
{
    [Key]
    [Display(Name = "CNPJ")]
    [Required(ErrorMessage = "Preencha este campo.")]
    [RegularExpression("[0-9]{2}\\.?[0-9]{3}\\.?[0-9]{3}\\/?[0-9]{4}\\-?[0-9]{2}", ErrorMessage = "Digite um CNPJ válido")]
    public string Cnpj { get; set; }
    [Display(Name ="Nome")]
    [Required(ErrorMessage ="Preencha este campo")]
    public string Nome { get; set; }
    public string DataSituacao { get; set; }
    public string MotivoSituacao { get; set; }
    public string Tipo { get; set; }
    public string Telefone { get; set; }
    public List<Qsa> Qsa { get; set; }

Qsa

public class Qsa
{
    [Key]
    public string Nome { get; set; }
    public string Qual { get; set; }

}

我尝试了很多方法来修复它,但我没有得到它

数据库上下文

public class MyDbContext : DbContext
{
    public MyDbContext(DbContextOptions<MyDbContext> options) : base(options)
    {
        Database.EnsureCreated();
    }
    public DbSet<Empresa> Empresa { get; set; }

    //public DbSet<Qsa> Qsa { get; set; }
    //public DbSet<Atividade> Atividade { get; set; }

    //protected override void OnModelCreating(ModelBuilder modelBuilder)
    //{

    //    foreach (var foreignKey in modelBuilder.Model.GetEntityTypes().SelectMany(e => e.GetForeignKeys()))
    //    {
    //        foreignKey.DeleteBehavior = DeleteBehavior.Restrict;
    //    }
    //    base.OnModelCreating(modelBuilder);

    //}
}

【问题讨论】:

标签: c# mysql .net database .net-core


【解决方案1】:

Empresa 你有

public List<Qsa> Qsa { get; set; }

Qsa 你有

[Key]
public string Nome { get; set; }

这会自动设置您需要首先从Qsa 中释放Empresa 依赖项的条件。

【讨论】:

  • 我已经尝试从“Qsa”释放依赖“Empresa”,但没有成功
【解决方案2】:

您在 Empresa 中有一个 Qsa 列表。这意味着 Qsa 具有 Impressa 外键(必须作为影子属性)。我建议你使用显式属性


public class Empresa
{
    [Key]
   public int Id {get; set;}
    .....

    public virtual ICollection<Qsa> Qsas { get; set; }
}
public class Qsa
{
    [Key]
    public int Id {get; set;}
    .....

   public int EmpresaId { get; set; }
   public virtual Empresa Empresa { get; set; }

}

之后你可以试试这个

var empresa = await _context.Empresa
                     .Include (i=> i.Qsas)
                     .Where(i=> i.Id==id)
                    .FirstOrDefault();

        if (empresa == null)
        {
            TempData["msg"] = "Este CNPJ não está cadastrado";
            return RedirectToAction("Delete");
        }
        
if( empresa.Qsas !=null)
{
_context.Qsa.RemoveRange(empresa.Qsas);
empressa.Qsas=null;
}
_context.Empresa.Remove(empresa);

await _context.SaveChangesAsync();

【讨论】:

  • 应用程序继续出现同样的错误
  • @Kaike 这是意料之中的,因为尚不清楚 Qsa 和 Empresa 之间的关系。恐怕你将不得不改变你的课程。你能发布你的dbcontext代码吗?
  • 我发布了我的 dbcontext
  • 你只有3张桌子吗?以及为什么您评论 //public DbSet Qsa { get;放; } //public DbSet Atividade { get;放; }?并请发布 Atividade 属性。
  • 我评论了“DB Atividade”,因为我可能不会再使用这个表了。我评论了“DB Qsa”,因为我正在测试其他东西。我需要知道如何在“Empresa”之前从数据库中删除列表“Qsa”,然后才能删除“Empresa”
猜你喜欢
  • 2017-09-15
  • 1970-01-01
  • 2021-11-13
  • 2017-06-11
  • 1970-01-01
  • 2019-05-25
  • 2014-11-11
  • 2018-05-12
相关资源
最近更新 更多