0

我有以下实体框架对象:
评估、阶段、公寓
评估包含许多阶段,阶段包含许多公寓。

我正在尝试删除某个阶段,如下所示:

var deletedStages =
  originalEvaluation.Stages.Where(s => s.State == StateTypes.Deleted);

deletedStages.ToList().ForEach(stage => 
{
  stage.Apartments.ToList().ForEach(
    apartment => stage.Apartments.Remove(apartment)
  );

  originalEvaluation.Stages.Remove(stage);
});

deletedStages.ToList().ForEach(stage =>
{
  stage.Apartments.ToList().ForEach(apartment =>
    shechtmanEntities.Apartments.DeleteObject(apartment)
  );

  shechtmanEntities.Stages.DeleteObject(stage);
});
}
}
try
{
  shechtmanEntities.SaveChanges();
}

但我不断收到异常:“无法更改关系,因为一个或多个外键属性不可为空”

我知道它与空外键有关,但我不明白哪个?为什么?

谢谢。

4

2 回答 2

0

尝试仅删除评估或阶段并依靠级联删除来删除它的子实体(在您的情况下为公寓),而不是单独删除它们。

于 2013-01-15T09:14:02.870 回答
0

如果您不能级联删除(SQL 服务器可能对此很有趣:https : //stackoverflow.com/a/6065583/613004)asdutzu 建议,那么:

如果它是一对多关系(听起来像是),那么您需要在删除父对象之前手动删除每个子对象并保存更改。IE 删除该公寓(或将其重新分配给另一个舞台),然后删除该舞台,依此类推。

否则,如果是多对多,并且连接表是通过实体模型暴露出来的,那么先删除stages和apartments之间的join,然后再删除stage。如果没有,detach则从舞台上的公寓并保存更改,然后再删除舞台。

于 2013-01-15T09:23:48.463 回答