【问题标题】: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();

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

【问题讨论】:

标签: c# entity-framework sql-delete


【解决方案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。 (onetwo

删除将与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 的例子。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-12
    • 2016-05-25
    相关资源
    最近更新 更多