删除实体中的集合

时间:2013-04-29 19:13:16

标签: c# entity-framework

我有一个拥有实体集合的实体,我希望删除该集合。该 收集是15K左右,正常删除需要很长时间。

Page objPage = context.Pages.Where(p => p.PageID == "27486451851").First();
objPage.UserPosts.ForEach(x => { context.Posts.Remove(x); });

如何才能在此方面获得更好的表现?

3 个答案:

答案 0 :(得分:1)

使用:

context.ExecuteStoreCommand("DELETE FROM [UsersPosts] WHERE PageID = @0", 27486451851);

答案 1 :(得分:1)

我在使用DbContext.Configuration.AutoDetectChangesEnabled = true添加和删除大量实体时发现性能显着下降。出于某种奇怪的原因,每当您致电DbContext.ChangeTracker.DetectChanges()DbSet<T>.Add()时,EF都会调用DbSet<T>.Remove()。这会导致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;

答案 2 :(得分:-1)

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