对于上面看到的数据模型,使用以下Entity Framework语句:
Student student = ctx.Students.Where(s => s.ID == 1).Single();
foreach (var mapping in student.Student_CourseMappings.ToList())
{
student.Student_CourseMappings.Remove(mapping);
}
ctx.SaveChanges();
导致错误说
"操作失败:无法更改关系,因为 一个或多个外键属性是不可为空的。当一个 改变了关系,......"
但以下陈述有效:
Student student = ctx.Students.Where(s => s.ID == 1).Single();
foreach (var mapping in student.Student_CourseMappings.ToList())
{
ctx.Student_CourseMappings.Remove(mapping);
}
ctx.SaveChanges();
为什么通过dbset删除不起作用,但通过dbcontext工作删除?
答案 0 :(得分:2)
在你的第一个代码中,你没有删除数据库中的实体,你试图打破学生与其课程之间的关系,例外是因为关系中的FK是必需的,所以你的孤儿实体需要在FK属性中有一个值。在第二个示例中,您将直接从DbSet<Student_CourseMapping>
删除实体,这将按预期删除表中的行。
我注意到的另一件事你需要知道的是你的第一个例子,你没有通过DbSet
删除,Student_CourseMappings
是Student
实体中的navigation property