Entity Framework 核心 - 无法删除可选的可空关系

Entity Framework Core - Cannot remove optional nullable relationship

使用 Microsoft.EntityFrameworkCore 版本 5.0.7Npgsql.EntityFrameworkCore.PostgreSQL 版本 5.0.7,我目前无法尝试删除关系并存储该更改。假设两个模型:

public class Banana {
  public int Id { get; set; }
  public Consumer? Consumer { get; set; }
}
public class Consumer {
  public int Id { get; set; }
}

我可以使用

分配一个消费者
myBanana.Consumer = dbContext.Consumers.First(row => row.Id == 1);
dbContext.Update(myBanana);
dbContext.SaveChanges();

而且效果很好 - 数据库会相应更新。但是,一旦存储,尝试使用

再次删除引用
myBanana.Consumer = null;
dbContext.Update(myBanana);
dbContext.SaveChanges();

失败。保存后,旧值仍在数据库中,而不是我期望的 null。有趣的是,对香蕉的其他更改都保存得很好。

我不确定我是否遇到了 Nullables 的奇怪问题,或者我是否只是遗漏了一些东西,所以我希望得到一些提示。

如果您想继续使用 auto-generated foreign key properties,您必须确保已加载导航。如果默认情况下它们是延迟加载的并且您不手动加载它们,则在您尝试分配 null 之前 属性 已经是 null,因此 EF 无法观察到变化.

使用 .Include(banana => banana.Consumer) 加载导航有效,通过 dbContext.Entry(myBanana).Reference(banana => banana.Consumer).Load() 加载导航也有效。加载相关导航项后,问题示例中的 myBanana.Consumer = null 按预期工作。


如果您有一个非跟踪实体可以使用(例如,因为它是由模型绑定生成的),您可以获取一个跟踪实体,或者更改自动生成的外键影子的值 属性直接:

dbContext.Entry(myBanana).Property("ConsumerId").CurrentValue = null;

这也有效。这可能不太完善,因为您依赖字符串作为正确的字段名称,但根据具体情况,它可能是一个有效的选项。