假设我们有一个要删除的实体列表:
var items = this.itemRepository.GetRange(1, 1000).ToList();
而不是简单的循环来删除items
,我想同时删除它们:
items.AsParallel().ForAll(item =>
{
this.itemRepository.Remove(item);
});
this.UnitOfWork.Commit();
您如何建议我执行此类删除?
答案 0 :(得分:3)
EF上下文不是线程安全的,所以我不会这样做。
如果您需要性能,请更快并行!=
。并行代码允许您同时执行更多操作,但是您倾向于发现单个工作单元至少花费相同的时间,但有时由于上下文切换等原因而导致更长时间,而不是仅执行5个操作在一次,你一次做5件事。这可以让您更有效地使用可用硬件,而不是性能,更多是关于可伸缩性和响应性。
async/await
支持公开了一个异步API,但这又允许对它进行一次“并发”操作。如果要进行多次异步读取,则每次读取操作都需要一个上下文 - 这只是将数据放在数据库上以管理完整性。
答案 1 :(得分:1)
EF6为RemoveRange
DbSet
方法
这比一次删除单个对象更有效,因为默认情况下,实体框架在DetectChanges
方法中调用Remove
,而RemoveRange
只调用一次。
但是,当您致电SaveChanges
时,EF仍会执行单独的删除声明。未来版本中有proposal to Batch CUD。
参考文献:
答案 2 :(得分:0)
如果您尚未使用它,请升级到EF6,然后您可以执行以下操作:
this.itemRepository.RemoveRange(items);