Entity Framework 核心 - 无法删除可选的可空关系
Entity Framework Core - Cannot remove optional nullable relationship
使用 Microsoft.EntityFrameworkCore
版本 5.0.7
和 Npgsql.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;
这也有效。这可能不太完善,因为您依赖字符串作为正确的字段名称,但根据具体情况,它可能是一个有效的选项。
使用 Microsoft.EntityFrameworkCore
版本 5.0.7
和 Npgsql.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;
这也有效。这可能不太完善,因为您依赖字符串作为正确的字段名称,但根据具体情况,它可能是一个有效的选项。