使用实体框架删除大量项目[重复]

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 的例子。谢谢。

以上是关于使用实体框架删除大量项目[重复]的主要内容,如果未能解决你的问题,请参考以下文章

需要使用实体框架将大量记录插入数据库

使用实体框架提高大型查询的性能 [重复]

使用实体框架从 ID 列表中删除多个项目

在实体框架中重复创建和删除数据库

实体框架与 NHibernate - 性能

使用通过 React GUI 触发的实体框架向 DB 添加新条目时出现重复条目