使用Entity Framework删除大量条目

8

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

我的问题是:有没有更好的方法来做这件事?


请查看以下内容:https://dev59.com/9GUp5IYBdhLWcg3whn1z - Paweł Reszka
我更新了问题,我不想删除表中的所有项目,我只想删除所有子项目。即:删除市场内的所有产品。 - user1150331
3个回答

25

试试这个

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

1
我的dbContect中没有这个方法.RemoveRange()。 - user1150331
@user1150331 更新你的 EF 到 6.0 版本,你就可以得到。 - user4093832
注:这仍然是关于 EF/.Net Core 的好回答,适用于 2020 年。 - paulsm4
仍然很棒的23'! - Sean Haddy

1

0

实体框架核心

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更有效。请注意,如果上下文中存在任何实体处于Added状态,则此方法将导致其与上下文分离。这是因为假定已添加的实体不存在于数据库中,因此尝试删除它是没有意义的。


你说得没错。但是……1)这基本上就是用户4093832六年前在上面链接中所说的,2)更常见的情况是你可能已经有了一个dbContext——在大多数“实际代码”中,很少需要使用“using/new Context()”。 - paulsm4
抱歉让你感到困惑。1. 我是从 Microsoft 学习的。2. 这确实适用于 OP 的例子。谢谢。 - Nguyen Van Thanh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接