关系未设置为空
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
将被加载
我有一个非常简单的 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
将被加载