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

时间:2014-04-23 12:54:13

标签: c# entity-framework concurrency parallel-processing dbcontext

假设我们有一个要删除的实体列表:

var items = this.itemRepository.GetRange(1, 1000).ToList();

而不是简单的循环来删除items,我想同时删除它们:

items.AsParallel().ForAll(item =>
        {
            this.itemRepository.Remove(item);
        });
this.UnitOfWork.Commit();

您如何建议我执行此类删除?

3 个答案:

答案 0 :(得分:3)

EF上下文不是线程安全的,所以我不会这样做。

如果您需要性能,请更快并行!=。并行代码允许您同时执行更多操作,但是您倾向于发现单个工作单元至少花费相同的时间,但有时由于上下文切换等原因而导致更长时间,而不是仅执行5个操作在一次,你一次做5件事。这可以让您更有效地使用可用硬件,而不是性能,更多是关于可伸缩性和响应性。

<小时/> 从EF 6开始,它为async/await支持公开了一个异步API,但这又允许对它进行一次“并发”操作。如果要进行多次异步读取,则每次读取操作都需要一个上下文 - 这只是将数据放在数据库上以管理完整性。

答案 1 :(得分:1)

EF6为RemoveRange

添加了DbSet方法

这比一次删除单个对象更有效,因为默认情况下,实体框架在DetectChanges方法中调用Remove,而RemoveRange只调用一次。

但是,当您致电SaveChanges时,EF仍会执行单独的删除声明。未来版本中有proposal to Batch CUD

参考文献:

Entity Framework 6: The Ninja Edition

RemoveRange - implemented in EF6. (with a bug fixed in 6.1)

答案 2 :(得分:0)

如果您尚未使用它,请升级到EF6,然后您可以执行以下操作:

this.itemRepository.RemoveRange(items);