删除

时间:2017-03-20 21:59:33

标签: c# entity-framework

enter image description here

对于上面看到的数据模型,使用以下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工作删除?

1 个答案:

答案 0 :(得分:2)

在你的第一个代码中,你没有删除数据库中的实体,你试图打破学生与其课程之间的关系,例外是因为关系中的FK是必需的,所以你的孤儿实体需要在FK属性中有一个值。在第二个示例中,您将直接从DbSet<Student_CourseMapping>删除实体,这将按预期删除表中的行。

我注意到的另一件事你需要知道的是你的第一个例子,你没有通过DbSet删除,Student_CourseMappingsStudent实体中的navigation property