我正在使用实体框架从表中删除几个项目。没有外键/父对象,所以我不能用 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,对吗?
如果您不想执行 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。