我有一个拥有实体集合的实体,我希望删除该集合。该 收集是15K左右,正常删除需要很长时间。
Page objPage = context.Pages.Where(p => p.PageID == "27486451851").First();
objPage.UserPosts.ForEach(x => { context.Posts.Remove(x); });
如何才能在此方面获得更好的表现?
答案 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");
}