我们一直在使用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上的通用回购模式中跳过连接(可能会破坏通用仓库的整个概念)。
任何链接,书籍参考或故事都会有所帮助
由于
答案 0 :(得分:0)
您不能在同一个DataContext上并行运行两个查询。如评论中所述,这在当前版本的EF中不起作用。您需要为特定方案创建单独的数据上下文(这会使代码变得更加复杂,不应该在没有明显好处的情况下完成)或切换到串行查询。
使用EF的正确方法是使用非异步,非SaveChanges调用Add / Update / Delete方法和async Select方法。您的SaveChanges应该是异步的,并调用DataContext的SaveChangesAsync。 SaveChanges将一起批量插入,更新和删除。
答案 1 :(得分:0)