[英]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.