微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Entity Framework Core - 无法删除可选的可为空关系

如何解决Entity Framework Core - 无法删除可选的可为空关系

使用 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;

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。