Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EntityFramework中的SaveChanges Vs Async_C#_Entity Framework_Async Await - Fatal编程技术网

C# EntityFramework中的SaveChanges Vs Async

C# EntityFramework中的SaveChanges Vs Async,c#,entity-framework,async-await,C#,Entity Framework,Async Await,我们一直在使用通用回购模式,我看到一些人将其称为反模式,但最好先开始,然后坐下来等待一切完成:-) 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,

我们一直在使用通用回购模式,我看到一些人将其称为反模式,但最好先开始,然后坐下来等待一切完成:-)

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

2) 我可以像在Senario 2上一样使用wait跳过泛型repo模式中的连接(这可能会破坏泛型repo的整个概念)吗

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


谢谢

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


使用EF的正确方法是使用非异步、非保存的更改,调用Add/Update/Delete方法和异步Select方法。您的SaveChanges应该是异步的,并调用DataContext的SaveChangesSync。SaveChanges会将您的插入、更新和删除一起批处理。

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

foreach (var item in arryTags)
{
    // Some Logic 
    _contentTagMapperRepository.Insert(oContentTagMapper);
}
_unitOfWork.SaveChanges();
使用工作单元,在探查器上跟踪

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


senario 2上最有可能的是joins将完成任务

该版本在实践中是否可行?我想你不能在一个EF DataContext上并行运行两个查询,但我可能错了。@Stilgar没有,只有在我缓慢调试时才起作用,允许DataContext以串行方式运行:-),那么你就不能这样做(至少不能在一个EF DataContext上),从savechanges批量插入多少相当于等待任务。Whalll(placeTask,orgTask);就并行执行而言?对于插入/更新/删除,我不希望是这样。我相信并行执行(从EF6开始,在单个数据上下文中同样不起作用)将打开到数据库的两个独立连接,而单个SaveChanges将使用一个连接并批处理实际查询。选择将不同,因为选择会立即执行(LINQ延迟执行除外)。如果并行版本实际上与单个数据上下文一起工作。那么EF是并行的,我猜我已经回答了
Task<Place> placeTask= _placeCore.SelectByIdAsync(id);
Task<Organization> organizationTask = _organizationCore.SelectByIdAsync(id);
await Task.WhenAll(placeTask, organizationTask);
foreach (var item in arryTags)
{
    // Some Logic 
    _contentTagMapperRepository.Insert(oContentTagMapper);
}
_unitOfWork.SaveChanges();