我有一个非常简单的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();
}
答案 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