关系未设置为null

时间:2015-01-22 16:22:56

标签: c# entity-framework null entity-framework-6.1

我有一个非常简单的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 = null之后,Teacher属性不会变为null。我尝试使用同步替代方案,它具有相同的效果:

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

1 个答案:

答案 0 :(得分:5)

如果未加载Teacher,则无法破坏关系。在查询中包含它(eager-load):

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

或者,如果启用了延迟加载,请在将属性设置为null之前访问该属性以进行读取:

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

您看到&#34; Teacher在设置为null&#34;之后不为空;因为调试器在将属性设置为null后正在访问属性以进行读取(延迟加载)。

在您点击null行之前,该值已经group.Teacher = null,因为您之前没有加载它(但是您无法对此进行调试,因为访问该属性进行读取会如果启用了延迟加载,则会导致EF实际加载它)。如果您在调试器之前看到属性值将其设置为null,那么它将按预期工作并中断关系,因为将加载Teacher