我有一个名为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
语句。可以?如果是,我如何删除实体框架中的所有时间窗口?
答案 0 :(得分:3)
只有在启用了延迟加载且尚未加载属性时,才会导致选择导航属性。所以第一次调用会导致类似:
SELECT * FROM TimeWindows WHERE TargetId = @targetId
并且所有计数评估将仅在加载的数据上执行。
您也可以使用它来避免第二个例外:
foreach (var tw in target.TimeWindows.ToList())
context.DeleteObject(tw);
或者您可以更改数据库和模型以支持identifying relation(FK到父级将成为TimeWindow的PK的一部分),在这种情况下,您的第一个代码段将起作用。