如何在从上下文中分离对象时删除EF6中的对象列表

好的我可以删除EF6中的单个项目,如下所示:

public void DeleteUserGroup(MY_GROUPS ug) { using (var context = new MYConn()) { var entry = context.Entry(ug); if (entry.State == EntityState.Detached) { context.MY_GROUPS.Attach(ug); } context.MY_GROUPS.Remove(ug); context.SaveChanges(); } } 

如果此方法从单个MY_GROUPS实例MY_GROUPSList我将如何处理删除?

是否有一种更有效的方法,然后只做一个foreach并一次设置一个状态?

更新 :我已经使用了类似的方法,使用RemoveRange方法。 但是我收到一个错误:

无法删除该对象,因为在ObjectStateManager中找不到该对象。

我正在寻找将对象列表附加到上下文的最佳方法,以便我可以删除它们。

为了能够删除记录,您需要确保您的ObjectContext正在跟踪它们。 现在你有了分离的对象,你的上下文不知道它们,所以不可能删除它们。 删除它们的一种方法是像你说的那样, Attach所有对象Attach到上下文,然后删除它们。 另一种方法是从数据库中获取记录,以便您可以删除它们:

 //Find all groups in database with an Id that is in your group collection 'ug' var groups = context.My_Groups.Where(g => ug.Any(u => u.Id == g.Id)); context.My_Groups.RemoveRange(groups); context.SaveChanges(); 

但请注意,即使使用RemoveRange ,也会根据要删除的项目向数据库发送删除命令。 RemoveRangeRemove之间的唯一区别是第一个只会调用一次DetectChanges ,这可以真正提高性能。

您可以使用RemoveRange

 context.MY_GROUPS.RemoveRange(context.MY_GROUPS.Where(x => x.columnName== "Foo")); 

您也可以像这样使用ForEach

 context.MY_GROUPS.Where(x => x.columnName == "Foo").ToList().ForEach(context.DeleteObject); context.SaveChanges(); 

您也可以使用ObjectContext.ExecuteStoreCommand Method作为另一种方法。

迭代您的集合并为每个集合设置Deleted状态

 groups.ForEach(group => ctx.Entry(group).State = EntityState.Deleted); ctx.SaveChanges(); 

EntityFramework 6+使用.RemoveRange()使这更容易一些。

  public void DeleteUserGroup(List ug) { using (var context = new MYConn()) { context.MY_GROUPS.RemoveRange(ug); context.SaveChanges(); } } 

通过使用Alexander Deck提供的解决方案 ,其中品牌是IEnumerable

 context.Brands.RemoveRange(context.Brands.Where(cb => brands.Any(b => b.Id == cb.Id))); 

我收到以下错误:

无法创建“SomeCompany.SomeApp.DB.Entities.Brand”类型的常量值。 在此上下文中仅支持原始类型或枚举类型。

它是通过使用AsEnumerable()扩展方法将Brands DBSet转换为IEnumerable来解决的:

 context.Brands.RemoveRange(context.Brands.AsEnumerable().Where(cb => brands.Any(b => b.Id == cb.Id))); 

这对我有用。