c#frameworkcore和mysql:无法删除或更新父行:外键约束失败

zvms9eto  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(217)

这里需要帮助。。。我直接从我的一个学校班级复制代码,他们会在代码中显示结果,但每次运行时,都会出现以下异常错误:
出现异常:clr/microsoft.entityframeworkcore.dbupdateexception microsoft.entityframeworkcore.dbupdateexception中出现类型为“microsoft.entityframeworkcore.dbupdateexception”的未处理异常:“更新条目时出错。”。有关详细信息,请参阅内部异常。找到内部异常时,有关详细信息,请参阅变量窗口中的$exception。最内部异常mysql.data.mysqlclient.mysqlexception:无法删除或更新父行:外键约束失败( movies . film_actor ,约束 film_actor_actor 外键( ActorId )参考文献 actor ( actorid ))在c:\projects\mysqlconnector\src\mysqlconnector\core\resultset.cs中mysqlconnector.core.resultset.d\uu 1.movenext()的system.runtime.exceptionservices.exceptiondispatchinfo.throw()处:第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();
    }
}

我已经检查了我的代码一遍又一遍,它完全符合教练的代码。不幸的是,没有人通过学校的黑板回答我的问题,所以我把我的问题带到这里。
该框架对数据库进行了反向工程,为代码构建了所有的脚手架。当的mysql语句 SaveChanges() 已发送。
但是,它必须来自这个表,因为 SaveChanges() 在代码的早期部分中用于其他内容,并且不会引发任何错误。
思想?我快疯了!谢谢。:)

Using:

C# 
ConsoleTables 
EntityFrameworkCore 
 + .Design 
 + .Tools         // Used as a DotNetCliToolReference 
 + .Tools.DotNet  // Used as a 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\u actor并删除与要删除的actor相关的actorid行,就可以完成修复。这是我在测试前做的快速循环 SaveChanges() 方法被执行:

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

我要感谢大家的帮助。我相信随着这节课的继续我会有更多的!谢谢。:)

xu3bshqb

xu3bshqb1#

这是最重要的信息:
无法删除或更新父行:外键约束失败(movies.film\u actor,约束film\u actor\u actor外键(actorid)引用actor(actorid)。
如果我正确地阅读了细节,那意味着列中有一个值 film_actor_actormovies.film_actor 指向id(在列中 ActorId )你想删除的演员的名字。
外键约束意味着您不能在删除 film_actor 先指向它,因为如果你指向它 film_actor 将指向不存在的行,这将导致数据库不一致。
解决方案:在删除actor行本身之前,需要删除对actor行的所有引用。

相关问题