我想删除一个包含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();
我的问题:有更好的方法吗?
答案 0 :(得分:9)
试试这个
var all = dbContext.XXX.Where(x => x.xxx == "xxx");
dbContext.XXX.RemoveRange(all);
dbContext.SaveChanges();
答案 1 :(得分:1)
看看batch extensions。 (one或two)
删除将与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的性能可能明显优于调用“移除多个” 时代会做到的。请注意,如果上下文中以“已添加”状态存在任何实体, 那么此方法将导致其与上下文分离。这是因为 假定数据库中不存在添加的实体,因此尝试删除 这没有道理。