簡體   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