关系未设置为空

Relationship not set to null

我有一个非常简单的 EF 操作失败了:中断两个实体之间的关系,如下面的代码所示:

public async Task RemoveCurrentTeacherOfGroup(int groupId)
{
    var group = await _dataContext.Groups.SingleAsync(g => g.Id == groupId);
    group.Teacher = null;
    await _dataContext.SaveChangesAsync();
}

数据库是代码优先生成的。实体定义如下:

public class Teacher
{
    public int Id { get; set; }
    ..
    public virtual List<Group> Groups { get; set; }
}
public class Group
{
    public int Id { get; set; }
    ..
    public virtual Teacher Teacher { get; set; }
}

不过,断绝关系也没用,老师一直指向同一个实体。使用调试器进行单步执行时,我看到 Teacher 属性 在 .Teacher = null 之后没有变为 null。我尝试使用同步替代方案,效果相同:

public void RemoveCurrentTeacherOfGroup(int groupId)
{
    var group = _dataContext.Groups.Single(g => g.Id == groupId);
    group.Teacher = null;
    _dataContext.SaveChanges();
}

如果 Teacher 未加载,则无法中断关系。在查询中包含它(急切加载):

_dataContext.Groups.Include(g => g.Teacher).Single(g => g.Id == groupId);

或者如果启用延迟加载,在将其设置为空之前访问属性进行读取:

var teacher = group.Teacher;
group.Teacher = null;

您看到“Teacher 在设置为 null 后不为空”,因为调试器在您设置后访问 属性 进行读取(延迟加载) null.

在您点击 group.Teacher = null 行之前该值已经是 null 因为您之前没有加载它(但是您不能调试它,因为访问 属性如果启用延迟加载,读取将导致 EF 实际加载它)。如果您在调试器 before 将其设置为 null 时看到 属性 值,它将按预期工作并打破关系,因为 Teacher 将被加载