2013-01-15 79 views
0

我有以下实体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(); 
} 

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

我知道它必须与一个空的外键,但我不明白哪个?为什么?

谢谢。

回答

0

如果你不能级联删除(SQL服务器可以是好笑的是:https://stackoverflow.com/a/6065583/613004)asdutzu提示,则:

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

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

0

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

+0

我试图从评估中删除阶段。 仅供参考 - 我试过只是删除舞台(不删除和删除所有的公寓),它不起作用(我得到同样的例外)。 – KayzerSoze

+2

然后,您应该先删除公寓并提交更改,然后删除阶段并提交更改。我还会用TransactionScope来包围这段代码,以确保如果出现错误,您不会完成一半的工作。 – dutzu