【问题标题】:C# FrameworkCore and MySQL: Cannot delete or update a parent row: a foreign key constraint failsC# FrameworkCore 和 MySQL:无法删除或更新父行:外键约束失败
【发布时间】:2019-02-03 18:07:21
【问题描述】:

在这里需要一些帮助...我直接从我的一所学校课程中复制代码,他们在代码中显示了结果,但每次我运行它时,我都会收到以下异常错误:

发生了异常: CLR/Microsoft.EntityFrameworkCore.DbUpdateException 未处理的 “Microsoft.EntityFrameworkCore.DbUpdateException”类型的异常 在 Microsoft.EntityFrameworkCore.dll 中发生:'发生错误 在更新条目时。有关详细信息,请参阅内部异常。 发现内部异常,请参阅变量窗口中的 $exception 了解更多信息 细节。最里面的异常 MySql.Data.MySqlClient.MySqlException : 无法删除或更新父行:外键约束失败 (movies.film_actor,约束film_actor_actor外键 (ActorId) 参考资料actor (actorid)) 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 MySqlConnector.Core.ResultSet.d__1.MoveNext() 在 C:\projects\mysqlconnector\src\MySqlConnector\Core\ResultSet.cs:line 44

这里是被调用的方法:

internal static void DeleteItem()
{
    Console.WriteLine("Delete an Actor");

    Console.WriteLine("Enter an Actor ID");
    var actorId = Console.ReadLine().ToInt();

    var actor = MoviesContext.Instance.Actors.SingleOrDefault(a => a.ActorId == actorId);
    if (actor == null) {
        Console.WriteLine($"Actor with id {actorId} not found.");
    }
    else {
        Console.WriteLine("Existing Actors");
        WriteActors();

        MoviesContext.Instance.Actors.Remove(actor);

        MoviesContext.Instance.SaveChanges();

        Console.WriteLine("With actor removed.");
        WriteActors();
    }
}

我一遍又一遍地检查我的代码,它与讲师的代码完美匹配。不幸的是,没有人通过大学黑板解决我的问题,所以我把我的问题带到了这里。

框架对数据库进行了逆向工程,以构建代码的所有脚手架。发送SaveChanges() 的 MySQL 语句时,程序会抛出此异常。

但是,它必须来自该表,因为SaveChanges() 在代码的早期部分中用于其他用途,并且不会引发任何错误。

想法?这是在驱使我鲁尼!谢谢。 :)

使用: C# 控制台表 EntityFrameworkCore + .设计 + .Tools // 用作 DotNetCliToolReference + .Tools.DotNet // 用作 DotNetCliToolReference + .MySql + .MySql.Design

我对约束一无所知,但这是我发现框架生成的可能是贡献者的代码部分:

modelBuilder.Entity<FilmActor>(entity =>
            {
                entity.HasKey(e => new { e.FilmId, e.ActorId });

                entity.ToTable("film_actor");

                entity.HasIndex(e => e.ActorId)
                    .HasName("film_actor_actor_idx");

                entity.Property(e => e.FilmId).HasColumnType("int(11)");

                entity.Property(e => e.ActorId).HasColumnType("int(11)");

                entity.HasOne(d => d.Actor)
                    .WithMany(p => p.FilmActor)
                    .HasForeignKey(d => d.ActorId)
                    .OnDelete(DeleteBehavior.ClientSetNull)
                    .HasConstraintName("film_actor_actor");

                entity.HasOne(d => d.Film)
                    .WithMany(p => p.FilmActor)
                    .HasForeignKey(d => d.FilmId)
                    .OnDelete(DeleteBehavior.ClientSetNull)
                    .HasConstraintName("film_actor_film");
            });

也许我在某个地方没有正确使用这个模型?

分辨率

在下面的大量帮助下,我能够通过简单地创建一个循环来完成修复,该循环遍历关联表 film_actor 并删除具有相关 ActorId 的所有行到被删除的演员。这是我在执行SaveChanges() 方法之前放入的快速循环:

foreach (var tatertot in MoviesContext.Instance.FilmActors) {
     if(tatertot.ActorId == actorId) {
          MoviesContext.Instance.FilmActors.Remove(tatertot);
     }
}

我要感谢大家的帮助。我相信随着这门课的进行,我会学到更多!谢谢你。 :)

【问题讨论】:

  • 您的电影类有外键 ActorId,您需要将其设置为 null 或从电影表中删除该行。
  • 我感谢到目前为止的所有帮助。不过,我觉得很失落。所有的数据库处理都是由实体框架创建的,并且数据库是在我们课程开始时分发的。我们没有与数据库直接交互,框架处理所有 MySQL 调用。不太清楚我应该如何处理这个问题。
  • 我在框架生成的代码中找到了有关“film_actor_actor”引用的信息。这里有什么我需要关注的吗?

标签: c# mysql entity-framework-core


【解决方案1】:

这是重要的信息:

无法删除或更新父行:外键约束失败(movies.film_actor, CONSTRAINT film_actor_actor FOREIGN KEY (ActorId) REFERENCES actor (actorid)。

如果我正确阅读了详细信息,这意味着movies.film_actor 中的film_actor_actor 列中有一个值指向您正在尝试的演员的ID(在ActorId 列中)删除。

外键约束意味着您不能先删除指向它的film_actor,因为如果这样做,film_actor指向一个不存在的行,这将使您的数据库不一致。

解决方案:您需要先删除对演员行的所有引用,然后才能删除演员行本身。

【讨论】:

  • 所以,我在movies.film_actor中找到了film_actor_actor作为外键约束。我还在表中看到 ActorId 值将其链接到 FilmId 值。在删除演员之前,我是否需要先循环并删除这些引用?
  • 因此,我设计了一个快速而肮脏的循环来遍历film_actor 表并找到任何具有ActorId 的条目并将它们删除。我还在稍后由在我的代码中不起作用的类详细说明的方法中实现了相同的想法。这是我想出的:foreach (var tatertot in MoviesContext.Instance.FilmActors) { if(tatertot.ActorId == actorId) { MoviesContext.Instance.FilmActors.Remove(tatertot); } } 这成功删除了所有的 tatertots。
  • @4verage 干得好,很高兴有用。好你也分享问题的最终解决方案! :)
  • Entity Framework 自动执行级联删除,不是吗?
猜你喜欢
  • 2017-09-15
  • 1970-01-01
  • 2021-11-13
  • 1970-01-01
  • 2017-06-11
  • 1970-01-01
  • 2019-05-25
  • 2014-11-11
相关资源
最近更新 更多