[英]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:不能刪除或更新父行,外鍵約束失敗(
movies
。film_actor
,約束film_actor_actor
外鍵(ActorId
)參考actor
(actorid
))在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_actor
的movies.film_actor
列中有一個值指向您要刪除的演員的ID(在ActorId
列中)。
外鍵約束意味着您不能在刪除film_actor
指向它的film_actor
之前刪除該film_actor
,因為如果這樣做,則film_actor
將指向一個不存在的行,這將導致數據庫不一致。
解決方案:您需要刪除對參與者行的所有引用,然后才能刪除參與者行本身。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.