删除实体框架中的所有相关实体

时间:2012-03-29 09:41:54

标签: entity-framework

我有一个名为Entry的实体连接到多个TimeWindows。我想清除所有时间窗口,然后添加新窗口。起初我试过了:

target.TimeWindows.Clear();

但这并没有真正删除它们,并且只有尝试来删除关系,这导致异常,因为从TimeWindows到Entry有外键。然后我想我应该这样做:

foreach (var tw in target.TimeWindows)
    context.DeleteObject(tw);

但这也会引发异常,因为在foreach语句中修改了集合。所以我想到了这个:

while (target.TimeWindows.Count > 0)
    context.DeleteObject(target.TimeWindows.Last());

但是现在我有点担心使用Count属性,因为它可能导致执行SQL SELECT COUNT语句。可以?如果是,我如何删除实体框架中的所有时间窗口?

1 个答案:

答案 0 :(得分:3)

只有在启用了延迟加载且尚未加载属性时,才会导致选择导航属性。所以第一次调用会导致类似:

SELECT * FROM TimeWindows WHERE TargetId = @targetId

并且所有计数评估将仅在加载的数据上执行。

您也可以使用它来避免第二个例外:

foreach (var tw in target.TimeWindows.ToList())
    context.DeleteObject(tw);

或者您可以更改数据库和模型以支持identifying relation(FK到父级将成为TimeWindow的PK的一部分),在这种情况下,您的第一个代码段将起作用。