使用Entity Framework删除大项目列表

时间:2014-11-13 09:20:35

标签: c# entity-framework sql-delete

我想删除一个包含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();

我的问题:有更好的方法吗?

3 个答案:

答案 0 :(得分:9)

试试这个

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

答案 1 :(得分:1)

看看batch extensions。 (onetwo

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

答案 2 :(得分: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();
}

摘要

从集合下的上下文中删除给定的实体集合 每个实体都处于Deleted状态,以便将其删除 从数据库中调用SaveChanges时。

备注

请注意,如果System.Data.Entity.Infrastructure.DbContextConfiguration.AutoDetectChangesEnabled 设置为true(这是默认值),那么DetectChanges将被调用一次 删除任何实体之前,将不会再次调用。这意味着在某些情况下 这种情况下,RemoveRange的性能可能明显优于调用“移除多个” 时代会做到的。请注意,如果上下文中以“已添加”状态存在任何实体, 那么此方法将导致其与上下文分离。这是因为 假定数据库中不存在添加的实体,因此尝试删除 这没有道理。