【问题标题】:EF Core - Error "The association between entities has been severed" while deleting child entity from parentEF Core - 从父实体中删除子实体时出现错误“实体之间的关联已被切断”
【发布时间】:2021-03-12 09:48:49
【问题描述】:

我有两个实体如下所示:

public class LiftPlan
{
    public int Id { get; set; }
    public ICollection<PlanConsiderationEntity> PlanConsiderations { get; set; }    
}

public class PlanConsideration
{
    public int Id { get; set; }

    public int PlanId { get; set; }
    public LiftPlan LiftPlan { get; set; }
}

关系配置为-

builder
    .HasOne(e => e.LiftPlan)
    .WithMany(e => e.PlanConsiderations)
    .HasForeignKey(e => e.PlanId)
    .OnDelete(DeleteBehavior.NoAction);

当我添加子实体时它可以工作 -

LiftPlan.PlanConsiderations.Add(planConsideration)

但是当我尝试删除子实体时

LiftPlan.PlanConsiderations.Remove(planConsideration)

它给了我错误-

实体“LiftPlanEntity”和“PlanConsiderationEntity”与键值“{PlanId: 1}”之间的关联已被切断,但该关系要么标记为“必需”,要么由于外键不可为空而被隐式要求。如果在切断所需关系时应删除依赖/子实体,则将关系设置为使用级联删除。

我尝试使用 -

dbContext.PlanConsiderations.Remove(planConsideration)

它使用dbContext 工作。

我不确定为什么会这样。它应该可以工作,因为我们没有删除父级。如果我们要删除父级,那么这个错误是有道理的。但是对于子删除它不应该发生。

注意:
我知道通过将关系设置为级联删除或将外键设为 null 将起作用,但我不想这样做。

【问题讨论】:

  • LiftPlan.PlanConsiderations.Remove(planConsideration)中,LiftPlanplanConsideration从何而来?编辑您的帖子并添加更完整的代码。

标签: sql-server entity-framework-core


【解决方案1】:

问题是,当您从LiftPlan 中删除PlanConsideration 时,需要从给定的PlanConsideration 中删除PlanId,但int PlanId 属性不可为空,所以这不是可能。

当您从 context.PlanConsiderations 中删除 PlanConsideration 时,它会起作用,因为该场景不会出现上述问题。

如果您将int PlanId 更改为int? PlanId(当然还要更新数据库架构),它应该可以正常工作而不会引发任何错误。

我不太明白的一件事是:

注意:我知道通过将关系设置为级联删除或将外键设为 null 将起作用,但我不想这样做。

如果您的意思是要保持该外键不可为空,强制它引用LiftPlan,我不确定这如何工作。我相当有信心,从 EF Core 的角度来看,这是相同的关系,只要实体上存在这些显式属性,就需要以两种方式表示。但也许有人会纠正我。


如果我没有告诉您任何新信息,请告诉我,以便我删除答案。 :)

【讨论】:

  • 嗨@leaky 感谢您的回复。我得到了答案,当您使用父级删除子级时,问题是导致 bcz,它使外键为空,这违反了不可为空的约束。在从父作品中删除子作品之前使用 dbContext.Entry(planConsideration).State = EntityState.Deleted
  • 听起来你正在使用它进行手动级联删除,但你在问题中说你不想级联删除:)
猜你喜欢
  • 1970-01-01
  • 2020-12-21
  • 1970-01-01
  • 2020-07-28
  • 1970-01-01
  • 2021-12-20
  • 2022-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多