使用实体框架删除大量项目[重复]
Posted
技术标签:
【中文标题】使用实体框架删除大量项目[重复]【英文标题】:Delete a big list of items with Entity Framework [duplicate] 【发布时间】:2015-01-10 09:11:26 【问题描述】:我想用EF删除一大堆项目,所以我尝试将它们一个一个删除,但需要很长时间。
我尝试在我的列表中使用.RemoveAll()
方法,但它不更新数据库[仅从加载的实体中删除]
所以我使用SqlCommand
将它们从数据库中删除,并使用.RemoveAll()
来防止EF unexpected number of rows update (0)
异常。
代码:
dbContext.Database.ExecuteSqlCommand("DELETE FROM xxx WHERE xxx");
loadedEntity.subItems.ToList().RemoveAll(r => true);
dbContext.SaveChanges();
我的问题:有没有更好的方法来做到这一点?
【问题讨论】:
看看这个:***.com/questions/15220411/… 我更新问题,我不想删除表中的所有项目我只想删除所有子项目。 IE:删除市场内的所有产品。 【参考方案1】:试试这个
var all = dbContext.XXX.Where(x => x.xxx == "xxx");
dbContext.XXX.RemoveRange(all);
dbContext.SaveChanges();
【讨论】:
我的 dbContect 中没有这个方法 .RemoveRange() @user1150331 更新你的 ef 到 6.0 你会得到 . 注意 - 这仍然是 EF/.Net Core 的良好响应,大约在 2020 年。【参考方案2】:看看batch extensions。 (one 或two)
删除将与dbContext.XXX.Delete(x => x.xxx == "xxx")
一样简单。
【讨论】:
【参考方案3】:实体框架核心
3.1 3.0 2.2 2.1 2.0 1.1 1.0
using (YourContext db = new YourContext())
var foundList=db.YourDbSet.Where(c=>c.YourProp=='someVal').ToList();
db.YourDbSet.RemoveRange(foundList);
db.SaveChanges();
总结:
从集合的上下文中删除给定的实体集合 将每个实体置于已删除状态,以便将其删除 调用 SaveChanges 时从数据库中获取。
备注:
请注意,如果 System.Data.Entity.Infrastructure.DbContextConfiguration.AutoDetectChangesEnabled 设置为 true (这是默认值),那么 DetectChanges 将被调用一次 在删除任何实体之前,不会再次调用。这意味着在某些 情况下 RemoveRange 的性能可能比调用 Remove multiple 好得多 时代会做。请注意,如果上下文中存在处于已添加状态的任何实体, 那么这个方法会导致它从上下文中分离出来。这是因为 假定添加的实体在数据库中不存在,因此尝试删除 这没有意义。
【讨论】:
你是对的。但是... 1) 这基本上是 user4093832 已经说过的above(六年前),并且 2) 通常你可能已经有一个 dbContext - 很少需要“使用/新 Context()”在大多数“现实世界”代码中。 抱歉让您感到困惑。 1.我是从Microsoft那里学到的。 2. 真的是 OP 的例子。谢谢。以上是关于使用实体框架删除大量项目[重复]的主要内容,如果未能解决你的问题,请参考以下文章