【问题标题】:SaveChanges Vs Async in EntityFrameworkEntityFramework 中的 SaveChanges 与异步
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 是否从 savechanges 批量插入或多或少等同于 await Task.WhenAll(placeTask, orgTask);在并行执行方面?
  • 对于插入/更新/删除我不希望它是。我相信并行执行(从 EF6 开始,它再次不适用于单个数据上下文)将打开两个单独的数据库连接,而单个 SaveChanges 将使用一个连接并批处理实际查询。选择会有所不同,因为选择会立即执行(LINQ 延迟执行除外)。如果并行版本实际使用单个数据上下文。
  • 所以我猜 EF 是平行的,我已经回答了
【解决方案2】:

这是通过 EF 6 进行的一些多次插入

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

使用工作单元,在探查器上跟踪

所以在整个 EF 中似乎在毫秒时间间隔上进行并行插入,所以在 senario 1 上,我猜 unitofWork 是理想的。

senario 2最有可能加入将完成任务

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多