如何同时从上下文中删除实体

本文关键字:删除 实体 上下文 何同时 | 更新日期: 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);