C# 删除实体中的集合

C# 删除实体中的集合,c#,entity-framework,C#,Entity Framework,我有一个拥有实体集合的实体,我希望删除该集合。这个 集合大约为15K,执行正常删除需要很长时间 Page objPage = context.Pages.Where(p => p.PageID == "27486451851").First(); objPage.UserPosts.ForEach(x => { context.Posts.Remove(x); }); 如何在这方面获得更好的性能?使用: using (var context = new DatabaseEntiti

我有一个拥有实体集合的实体,我希望删除该集合。这个 集合大约为15K,执行正常删除需要很长时间

Page objPage = context.Pages.Where(p => p.PageID == "27486451851").First();
objPage.UserPosts.ForEach(x => { context.Posts.Remove(x); });
如何在这方面获得更好的性能?

使用:

using (var context = new DatabaseEntities())
{
    context.ExecuteStoreCommand("DELETE FROM Pages WHERE PageID == {0}", "27486451851");
}

context.ExecuteStoreCommand(“从[UsersPosts]中删除,其中PageID=@0”,27486451851)

我观察到,在添加和删除大量具有
DbContext.Configuration.AutoDetectChangesEnabled=true的实体时,性能显著下降。出于某种奇怪的原因,每次调用
DbSet.Add()
DbSet.Remove()
时,EF都会在引擎盖下调用
DbContext.ChangeTracker.DetectChanges()
。这会导致ChangeTracker在整个集合中的每个实体中迭代,以查找每次添加/删除时的更改。这似乎完全没有必要

下面是一个可能的解决方案,它会推迟更改检测,直到您删除了所有Post实体,从而只调用一次
context.ChangeTracker.DetectChanges()

context.Configuration.AutoDetectChangesEnabled = false;
Page objPage = context.Pages.Where(p => p.PageID == "27486451851").First();
objPage.UserPosts.ForEach(x => { context.Posts.Remove(x); });
context.ChangeTracker.DetectChanges();
context.SaveChanges();
context.Configuration.AutoDetectChangesEnabled = true;

我会小心地判断EF的作者是否需要快速地进行“不必要的更改检查”。被删除的实体本身可能具有双面导航属性。也就是说,自动检测更改使得添加-删除操作确实非常缓慢。