gpt4 book ai didi

entity-framework - ASP.NET Core Task.WhenAll - 在上一个操作完成之前在此上下文中启动了第二个操作

转载 作者:行者123 更新时间:2023-12-04 17:27:36 25 4
gpt4 key购买 nike

我开始尝试将我的数据库查询转换为异步,但我真的不明白如何正确地做到这一点。

我现在收到错误:

在前一个操作完成之前,在此上下文中启动了第二个操作。这通常是由使用相同 DbContext 实例的不同线程引起的。有关如何避免 DbContext 线程问题的更多信息

public async Task<IList<MyObject>> GetAll(MyContext context)
    {
        
return (await Task.WhenAll(
 MethodA(context), MethodB(context)))
 .SelectMany(e => e)
 .ToList();
}

private async Task<IList<MyObject>> MethodA(MyContext context)
 {
 

return await context.MyThings.Include(x => x.Stuff)

//full query removed for readability
.ToListAsync();

}

private async Task<IList<MyObject>> MethodB(MyContext context)
 {
 

return await context.MyThings.Include(x => x.Stuff)

//full query removed for readability
.ToListAsync();

}

索引.cs:
public Task<IList<MyObject>> MyDBList  { get; set; }

public void OnGet()
 {
 
 MyDBList = _myInterface.GetAll_context);

}

索引.cshml

     @foreach (var x in Model.MyDBList)
    {
<p>x.ID</p>
}

我厌倦了让 dbcontext 成为 transient ,但这并没有什么区别。我还担心它会破坏我更新数据库中条目的许多其他代码。

我可以看到错误发生的原因,我在同一个上下文中运行两个查询,但我不知道如何修复它。

任何人都可以建议吗?

最佳答案

I can see why the error is happening, I am running two queries on the same context, but I don't know how to fix it.



修复它的最简单方法是一次只运行一个查询:
public async Task<IList<MyObject>> GetAll(MyContext context)
{
var resultsA = await MethodA(context);
var resultsB = await MethodB(context);
return resultsA.Concat(resultsB).ToList();
}

更好的是,重组 MethodAMethodB这样只有一个查询被发送到数据库。

关于entity-framework - ASP.NET Core Task.WhenAll - 在上一个操作完成之前在此上下文中启动了第二个操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62310458/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com