实体框架 - 删除复杂对象

时间:2013-01-15 09:12:04

标签: c# entity-framework

我有以下Entity Framwork对象:
评价,舞台,公寓
评估包含许多阶段,舞台包含许多公寓。

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

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();
}

但我一直有例外:“由于一个或多个外键属性不可为空而无法更改关系”

我知道它与null外键有关,但我无法理解哪个?为什么?

感谢。

2 个答案:

答案 0 :(得分:0)

尝试删除评估或舞台,并依靠级联删除删除它的子实体(在您的情况下为公寓),而不是逐个删除它们。

答案 1 :(得分:0)

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

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

否则,如果它是多对多,并且通过实体模型公开连接表,则首先删除阶段和公寓之间的连接,然后删除阶段。如果没有,则在舞台上detach公寓并保存更改,然后再删除舞台。