【发布时间】:2019-02-03 18:07:21
【问题描述】:
在这里需要一些帮助...我直接从我的一所学校课程中复制代码,他们在代码中显示了结果,但每次我运行它时,我都会收到以下异常错误:
发生了异常: CLR/Microsoft.EntityFrameworkCore.DbUpdateException 未处理的 “Microsoft.EntityFrameworkCore.DbUpdateException”类型的异常 在 Microsoft.EntityFrameworkCore.dll 中发生:'发生错误 在更新条目时。有关详细信息,请参阅内部异常。 发现内部异常,请参阅变量窗口中的 $exception 了解更多信息 细节。最里面的异常 MySql.Data.MySqlClient.MySqlException : 无法删除或更新父行:外键约束失败 (
movies.film_actor,约束film_actor_actor外键 (ActorId) 参考资料actor(actorid)) 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 MySqlConnector.Core.ResultSet.d__1.MoveNext() 在 C:\projects\mysqlconnector\src\MySqlConnector\Core\ResultSet.cs:line 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();
}
}
我一遍又一遍地检查我的代码,它与讲师的代码完美匹配。不幸的是,没有人通过大学黑板解决我的问题,所以我把我的问题带到了这里。
框架对数据库进行了逆向工程,以构建代码的所有脚手架。发送SaveChanges() 的 MySQL 语句时,程序会抛出此异常。
但是,它必须来自该表,因为SaveChanges() 在代码的早期部分中用于其他用途,并且不会引发任何错误。
想法?这是在驱使我鲁尼!谢谢。 :)
使用: C# 控制台表 EntityFrameworkCore + .设计 + .Tools // 用作 DotNetCliToolReference + .Tools.DotNet // 用作 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 并删除具有相关 ActorId 的所有行到被删除的演员。这是我在执行SaveChanges() 方法之前放入的快速循环:
foreach (var tatertot in MoviesContext.Instance.FilmActors) {
if(tatertot.ActorId == actorId) {
MoviesContext.Instance.FilmActors.Remove(tatertot);
}
}
我要感谢大家的帮助。我相信随着这门课的进行,我会学到更多!谢谢你。 :)
【问题讨论】:
-
您的电影类有外键 ActorId,您需要将其设置为 null 或从电影表中删除该行。
-
我感谢到目前为止的所有帮助。不过,我觉得很失落。所有的数据库处理都是由实体框架创建的,并且数据库是在我们课程开始时分发的。我们没有与数据库直接交互,框架处理所有 MySQL 调用。不太清楚我应该如何处理这个问题。
-
我在框架生成的代码中找到了有关“film_actor_actor”引用的信息。这里有什么我需要关注的吗?
标签: c# mysql entity-framework-core