如何在从上下文中分离对象时删除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_GROUPS
为List
我将如何处理删除?
是否有一种更有效的方法,然后只做一个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
,也会根据要删除的项目向数据库发送删除命令。 RemoveRange
和Remove
之间的唯一区别是第一个只会调用一次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)));
这对我有用。