使用实体框架删除大量项

本文关键字:删除 框架 实体 | 更新日期: 2023-09-27 18:30:16

我想用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();

我的问题:有没有更好的方法可以做到这一点?

使用实体框架删除大量项

试试这个

var all = dbContext.XXX.Where(x => x.xxx == "xxx");
dbContext.XXX.RemoveRange(all);
dbContext.SaveChanges(); 

看看批量扩展。(一个或两个)

删除将像dbContext.XXX.Delete(x => x.xxx == "xxx")一样简单。

实体框架核心

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();
}

总结

从集合的基础上下文中删除给定的实体集合 将每个实体置于"已删除"状态,以便将其删除 调用保存更改时从数据库中。

备注

请注意,如果 System.Data.Entity.Infrastructure.DbContextConfiguration.AutoDetectChangesEnabled 设置为 true(这是默认值),则检测更改将被调用一次 之前删除任何实体,并且不会再次调用。这意味着在某些 情况 删除范围 可能比调用删除多个要好得多 时代就行了。请注意,如果上下文中存在任何处于"已添加"状态的实体, 然后此方法将导致它与上下文分离。这是因为 假定数据库中不存在已添加的实体,因此尝试删除 这没有意义。