【发布时间】:2015-11-26 13:40:41
【问题描述】:
我们一直在使用 Generic Repo 模式,我看到一些声音称之为反模式,但最好先开始一些事情然后坐下来等待一切完成:-)
情景 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();
对比
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 上使用 await 跳过通用 repo 模式中的连接(这可能会破坏通用 repo 的整个概念)吗?
任何链接、书籍参考或故事都会有所帮助
谢谢
【问题讨论】:
-
带有WhenAll 的版本在实践中有效吗?我认为您不能在单个 EF DataContext 上并行运行两个查询,但我可能错了。
-
@Stilgar 它没有,只有当我慢慢调试允许数据上下文串行运行时才起作用:-)
-
那么您根本无法做到这一点(至少不能使用单个 EF DataContext)
标签: c# entity-framework async-await