如何删除实体框架中的多行没有 foreach

问题描述

如果您不想执行 sql,直接在循环中调用 DeleteObject 是您今天可以做的最好的事情。

但是,您可以使用我在此处描述的方法,通过扩展方法执行 sql 并使其完全通用。

虽然该系列的重点是更新,但您绝对可以使用所涉及的原则进行删除

所以你应该能够写出这样的东西:

var query = from c in ctx.Customers
            where c.SalesPerson.Email == "..."
            select c;

query.Delete();

您需要做的就是实现 Delete() 扩展方法。有关如何…的提示,请参阅帖子系列

希望这可以帮助

尽管那个答案是针对 3.5 的。对于 4.0,我可能会在底层使用新的 ExecuteStoreCommand API,而不是直接使用 StoreConnection。

解决方法

我正在使用实体框架从表中删除几个项目。没有外键/父对象,所以我不能用 OnDeleteCascade 处理这个。

现在我正在这样做:

var widgets = context.Widgets
    .Where(w => w.WidgetId == widgetId);

foreach (Widget widget in widgets)
{
    context.Widgets.DeleteObject(widget);
}
context.SaveChanges();

它可以工作,但 foreach 让我感到困惑。我正在使用 EF4,但我不想执行
SQL。我只是想确保我没有遗漏任何东西——这是最好的,对吧?我可以使用扩展方法或帮助器对其进行抽象,但我们仍将在某个地方进行 foreach,对吗?