C# 删除时DbSet和DbContext的差异

C# 删除时DbSet和DbContext的差异,c#,entity-framework,C#,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())
{
    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删除起作用

在第一个代码中,您没有从数据库中删除实体,而是试图打破学生与其课程之间的关系,例外情况是关系中的FK是必需的,因此孤立实体需要在FK属性中具有值。在第二个示例中,您直接从
DbSet
中删除实体,这将按照预期从表中删除行


我注意到现在您需要知道的另一件事是,在您的第一个示例中,您没有通过
DbSet
删除,
Student\u CourseMappings
Student
中的一个实体

第一个
Remove
使其成为孤立(
UPDATE
)(由于非空关系而失败),第二个将其从数据库中删除(
REMOVE