【问题标题】:A second operation started on this context before a previous operation completed upgrading EF Core 2 to EF Core 3.1.3 [duplicate]在上一个操作完成将 EF Core 2 升级到 EF Core 3.1.3 之前,在此上下文中启动了第二个操作 [重复]
【发布时间】:2020-04-17 21:59:01
【问题描述】:

我刚刚尝试从 EF Core 2 升级到 EF Core 3。我的每个调用都是一个 Async Task 方法,但我仍然收到 A“第二个操作开始,请参阅 https://go.microsoft.com/fwlink/?linkid=2097913”错误。我知道它说要等待每种方法,但这不会破坏进行异步调用的目的吗?另外,为什么它在 EF Core 2 而不是 EF Core 3 中工作?如果我必须使用 diff db 上下文,如何通过 .net core 3 中的依赖注入来完成?

// Async method that we will await later.
var softwareServiceCodeTask = _pricingCalcRepo.IsSoftwareServiceCodeAsync(jobsId)

pricingCalcInfo = await GetJobDetailsAsync(jobsId);

        private async Task<PricingCalculationInfo> GetJobDetailsAsync(int jobsId)
        {
            return await (
                   from jobs in _contextProposal.PRP_Jobs
                   join service in _contextProposal.PRP_Service on jobs.ServiceId equals service.ServiceId
                   join proposal in _contextProposal.PRP_Proposal on service.ProposalId equals proposal.ProposalId
                   where jobs.JobsId == jobsId
                   select new PricingCalculationInfo
                   {
                       ContractYear = proposal.ContractYear,
                       BidCrewSize = jobs.BidCrewSize,
                       ServiceCode = service.ServiceCode,
                       Territory = jobs.Territory,
                       TotalPONIs = jobs.TotalPONIs,
                       WeekWorkHours = _appSettings.Value.WeekWorkHours,
                       NonProductiveHoursPerWeek = _appSettings.Value.NonProductiveHoursPerWeek
                   }).FirstAsync();
        }

【问题讨论】:

    标签: c# asp.net-core entity-framework-core asp.net-core-3.0


    【解决方案1】:

    必须等待第一行。 EF 不允许同时运行多个同时操作。虽然许多查询可能会并行运行,但 EF 不支持并行查询,基本上只是将它们完全切断,以防万一某些事情无法正常工作。

    总之,您需要等待将立即使用 EF 上下文的所有内容。您不能让它运行并尝试进行另一个查询。

    更新

    需要明确的是,EF 从不支持并行查询。这包括 EF Core 和较旧的 EF。但是,EF Core 之前并未明确阻止您这样做,但结果从未得到保证。然而,它没有明确阻止你的事实给了很多人的印象,那就是它很好,我认为这就是他们现在明确阻止你的原因。就像我说的那样,大多数时候它可能会很好,但是在某些极端情况下它可能会破坏一切。由于 EF 并没有真正制定处理这些边缘情况的计划,因此它完全阻止了您。你可以说这是 EF 的失败,而且很可能是这样,但事实就是这样:你不能在 EF 中并行运行查询。

    【讨论】:

    • 那不是违背了它作为异步调用的目的吗?使数据库上下文瞬态有什么负面影响吗?
    • 没有。异步与并行不是一回事,也不是有意的。异步是关于规模的:允许更有效地使用资源。就是这样。
    • 是的,更改 EF 上下文生存期会产生负面影响。 EF 使用了许多优化,这些优化取决于它的生命周期,至少在请求的生命周期内是这样。不要让它短暂。
    • 所以如果我有 4 个调用,前 3 个是设置第 4 个调用的 db 调用,因此它们可以异步运行,但是最后一个调用需要所有 3 条信息,最好的处理方法是什么这个?理想情况下,我想运行前 3 个异步,然后等待所有任务完成,然后再调用第 4 个调用,对吗?
    • 他们已经异步运行了。同样,异步!= 并行。您不能并行查询 EF,因此您想要做的事情基本上是不可能的。您必须等待每个内联调用。
    猜你喜欢
    • 2020-11-06
    • 2019-05-25
    • 2020-05-11
    • 2018-11-07
    • 1970-01-01
    • 2018-07-23
    • 1970-01-01
    • 2020-09-30
    • 2021-05-04
    相关资源
    最近更新 更多