我有一个包含实体集合的实体,我希望删除该集合。集合15K左右,正常删除需要很长时间。
Page objPage = context.Pages.Where(p => p.PageID == "27486451851").First();
objPage.UserPosts.ForEach(x => { context.Posts.Remove(x); });
我怎样才能在这方面获得更好的表现?
我有一个包含实体集合的实体,我希望删除该集合。集合15K左右,正常删除需要很长时间。
Page objPage = context.Pages.Where(p => p.PageID == "27486451851").First();
objPage.UserPosts.ForEach(x => { context.Posts.Remove(x); });
我怎样才能在这方面获得更好的表现?
利用:
context.ExecuteStoreCommand("DELETE FROM [UsersPosts] WHERE PageID = @0", 27486451851);
在使用DbContext.Configuration.AutoDetectChangesEnabled = true
. 出于某种奇怪的原因,EFDbContext.ChangeTracker.DetectChanges()
每次调用时都会在后台调用DbSet<T>.Add()
or 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;
using (var context = new DatabaseEntities())
{
context.ExecuteStoreCommand("DELETE FROM Pages WHERE PageID == {0}", "27486451851");
}