EntityFramework中的SaveChanges与Async

时间:2015-08-05 12:34:43

标签: c# entity-framework async-await

我们一直在使用Generic Repo模式,我看到一些声音称它为反模式,但最好是开始一些东西然后等待一切都完成: - )

Senario 1

var placeStatus = await _placeService.AddAsync(oPlace, false); // here false just add to context and don't hit Savechanges
var orgStatus = await _organizationService.AddAsync(oOrganization, false);
_unitOfWork.SaveChanges();

Vs的

Task<short> placeStatus = _placeService.AddAsync(oPlace, true);
Task<short> orgStatus = _organizationService.AddAsync(oOrganization, true);
await Task.WhenAll(placeTask, orgTask);

由于我的知识有限,我假设SaveChanges()在第一种情况下在内部维护回滚,而在第二种情况下我将不得不处理回滚。我还假设从await Task.WhenAll

执行并行执行

1)所以SaveChanges()是否并行?如果原子性不是问题或问题,那么比第二个还要高效,如果我做第二个,我是否正确?

Senario 2

Task<Place> placeTask= _placeCore.SelectByIdAsync(id);
Task<Organization> organizationTask = _organizationCore.SelectByIdAsync(id);
await Task.WhenAll(placeTask, organizationTask);

2)我可以使用等待在Senario 2上的通用回购模式中跳过连接(可能会破坏通用仓库的整个概念)。

任何链接,书籍参考或故事都会有所帮助

由于

2 个答案:

答案 0 :(得分:0)

您不能在同一个DataContext上并行运行两个查询。如评论中所述,这在当前版本的EF中不起作用。您需要为特定方案创建单独的数据上下文(这会使代码变得更加复杂,不应该在没有明显好处的情况下完成)或切换到串行查询。

使用EF的正确方法是使用非异步,非SaveChanges调用Add / Update / Delete方法和async Select方法。您的SaveChanges应该是异步的,并调用DataContext的SaveChangesAsync。 SaveChanges将一起批量插入,更新和删除。

答案 1 :(得分:0)

以下是通过EF 6进行的多次插入

foreach (var item in arryTags)
{
    // Some Logic 
    _contentTagMapperRepository.Insert(oContentTagMapper);
}
_unitOfWork.SaveChanges();

使用工作单元,在分析器上跟踪

enter image description here

所以看起来整体EF在毫秒时间间隔内进行并行插入所以在Senario 1上,我猜unitofWork是理想的我想。

senario 2 上,最可能的联接将执行任务