gpt4 book ai didi

c# - 关系未设置为空

转载 作者:太空狗 更新时间:2023-10-30 01:03:32 24 4
gpt4 key购买 nike

我有一个非常简单的 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 属性在 .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);

或者如果启用了延迟加载,则在将其设置为 null 之前访问要读取的属性:

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

你看到“Teacher is not null after setting it to null”因为调试器在你设置后访问属性以读取(延迟加载)它为 null

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

关于c# - 关系未设置为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28093728/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com