繁体   English   中英

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

[英]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 的奇怪问题,或者我是否只是遗漏了一些东西,所以我希望得到一些提示。

如果您想继续使用自动生成的外键属性,您必须确保导航已加载。 如果他们是懒加载默认情况下,你不手动加载它们,物业就已经是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;

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM