这里需要帮助。。。我直接从我的一个学校班级复制代码,他们会在代码中显示结果,但每次运行时,都会出现以下异常错误:
出现异常: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);
}
}
我要感谢大家的帮助。我相信随着这节课的继续我会有更多的!谢谢。:)
1条答案
按热度按时间xu3bshqb1#
这是最重要的信息:
无法删除或更新父行:外键约束失败(movies.film\u actor,约束film\u actor\u actor外键(actorid)引用actor(actorid)。
如果我正确地阅读了细节,那意味着列中有一个值
film_actor_actor
在movies.film_actor
指向id(在列中ActorId
)你想删除的演员的名字。外键约束意味着您不能在删除
film_actor
先指向它,因为如果你指向它film_actor
将指向不存在的行,这将导致数据库不一致。解决方案:在删除actor行本身之前,需要删除对actor行的所有引用。