如何同时从上下文中删除实体
本文关键字:删除 实体 上下文 何同时 | 更新日期: 2023-09-27 17:59:27
假设我们有一个要删除的实体列表:
var items = this.itemRepository.GetRange(1, 1000).ToList();
我不想简单地循环删除items
,而是想像这样同时删除它们:
items.AsParallel().ForAll(item =>
{
this.itemRepository.Remove(item);
});
this.UnitOfWork.Commit();
你建议我如何执行这样的删除操作?
EF上下文不是线程安全的,所以我不会这么做。
如果您需要性能,请更快地并行!=
。并行代码允许你在同一时间做更多的事情,但你会发现一个工作单元至少需要同样的时间,但有时由于上下文切换等原因会更长,只是你不是一次做5件事,而是一次做五件事。这可以让您更有效地使用可用硬件,而不是性能,而是可扩展性和响应性。
从EF 6开始,它公开了一个异步API以支持
async/await
,但这同样只允许对其执行一个"并发"操作。如果您想执行多个异步读取,则每个读取操作需要一个上下文-这只会让数据库承担管理完整性的责任。
EF6向DbSet
添加了RemoveRange
方法
这比一次删除单个对象更有效,因为默认情况下,实体框架在Remove
方法中调用DetectChanges
,而RemoveRange
只调用一次。
但是,当您调用SaveChanges
时,EF仍然执行单独的delete语句。有一个在未来版本中批处理CUD的建议。
参考文献:
实体框架6:忍者版
RemoveRange-在EF6中实现。(在6.1中修复了一个错误)
如果您还没有使用EF6,那么您可以执行以下操作:
this.itemRepository.RemoveRange(items);