首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多线程DbContext操作

问多线程DbContext操作
EN

Stack Overflow用户
提问于 2021-07-31 15:40:43
回答 1查看 81关注 0票数 0

下面的代码(在单个DbContext上)导致“在以前的操作完成之前,在此上下文上启动第二个操作”。

代码语言:javascript
复制
[HttpGet]
[Route("api/[controller]/circuit")]
public async Task<IEnumerable<object>> GetAllCircuits()
{
    var circuits = await Task.WhenAll((await _context.Circuits.ToListAsync()).Select(async x => new
    {
        x.Id,
        x.FastestLap,
        x.LengthInMiles,
        Country = await _context.Countries.FirstOrDefaultAsync(c => c.Id == x.CountryId),
        Map = await _context.Maps.FirstOrDefaultAsync(m => m.Id == x.MapId),
        Locations = await _context.Locations.Where(l => l.CircuitId == x.Id).ToListAsync()
    }));

    return circuits;
}

我可以通过去掉async/await和Task.WhenAll部件,用.Result替换它们,这在.NET中似乎是一个很大的禁忌。

代码语言:javascript
复制
[HttpGet]
[Route("api/[controller]/circuit")]
public async Task<IEnumerable<object>> GetAllCircuits()
{
    var circuits = (await _context.Circuits.ToListAsync()).Select(x => new
    {
        x.Id,
        x.FastestLap,
        x.LengthInMiles,
        Country = _context.Countries.FirstOrDefaultAsync(c => c.Id == x.CountryId).Result,
        Map = _context.Maps.FirstOrDefaultAsync(m => m.Id == x.MapId).Result,
        Locations = _context.Locations.Where(l => l.CircuitId == x.Id).ToListAsync().Result
    });

    return circuits;
}

我的三个问题是:

  1. 为什么会发生这种情况?
  2. 是“固定的”代码吗?如果没有,请您提出一个更好的方法好吗?
  3. ,我可以只使用.ToList()而不是异步变体吗?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-31 16:00:24

为什么会发生这种事?

DbContext不允许在同一个db连接上进行多个操作。在本例中,您有一个调用(ToListAsync),然后是多个并发调用( Select)。

的“固定”代码干净吗?如果没有,请你提出一个更好的办法好吗?

不是的。你不应该使用.Result。

你的选择是:

  1. (理想)更改LINQ查询,以便它在一个查询中包含所有必要的信息,例如使用联接或包含。这是理想的解决方案,因为只有一个查询,而db服务器可以处理它--大多数efficiently.
  2. Only一次只执行一个操作,因为您只有一个连接。这就是为什么.Result能够工作,但更好的解决方案是使用await,一次只做一次,而不是在Task.WhenAll中使用Select。这种方法的缺点是操作一次只执行一次。
  3. 保留多个操作,并且每次操作打开一个db连接。这种方法的缺点是它需要多个db connections.

。

我可以只使用.ToList()而不是异步变体吗?

ToListAsync不是问题所在。问题是Select + WhenAll。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68603561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档