0

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

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

我怎样才能在这方面获得更好的表现?

4

3 回答 3

1

利用:

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

于 2013-04-29T19:38:11.740 回答
1

在使用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;
于 2013-04-29T19:52:50.797 回答
-1
using (var context = new DatabaseEntities())
{
    context.ExecuteStoreCommand("DELETE FROM Pages WHERE PageID == {0}", "27486451851");
}
于 2013-04-29T19:16:49.107 回答