繁体   English   中英

C#FrameworkCore和MySQL:无法删除或更新父行:外键约束失败

[英]C# FrameworkCore and MySQL: Cannot delete or update a parent row: a foreign key constraint fails

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

发生了异常:CLR / Microsoft.EntityFrameworkCore.DbUpdateException Microsoft.EntityFrameworkCore.dll中发生了类型为'Microsoft.EntityFrameworkCore.DbUpdateException'的未处理异常:'更新条目时发生了错误。 有关详细信息,请参见内部异常。 找到内部异常,有关更多详细信息,请参见变量窗口中的$ exception。 最里面的异常MySql.Data.MySqlClient.MySqlException:不能删除或更新父行,外键约束失败( moviesfilm_actor ,约束film_actor_actor外键( ActorId )参考actoractorid ))在System.Runtime.ExceptionServices.ExceptionDispatchInfo。在C:\\ projects \\ mysqlconnector \\ src \\ MySqlConnector \\ Core \\ ResultSet.cs:line 44中的MySqlConnector.Core.ResultSet.d__1.MoveNext()处抛出()

这是被调用的方法:

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()在代码的较早部分中用于其他用途,并且不会引发任何错误。

有想法吗? 这让我发疯! 谢谢。 :)

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_actor并删除了与要删除的actor相关的具有ActorId的任何行。 这是我在执行SaveChanges()方法之前放入的快速循环:

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

我要感谢大家的帮助。 随着课程的进行,我相信我还会有更多! 谢谢。 :)

这是至关重要的信息:

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM