Blazor在此之前的上下文中开始了第二次操作

时间:2019-09-22 04:20:38

标签: asp.net-core blazor blazor-server-side blazor-client-side

我动态创建NavMenu并由用户返回数据库菜单,在索引页面中,我已经在数据库中返回了一些内容,但是当我运行应用程序或重新加载它时,显示以下错误

  

InvalidOperationException:第二个操作在此上下文上开始   在上一个操作完成之前。这通常是由   使用同一DbContext实例的不同线程。欲了解更多   有关如何避免DbContext出现线程问题的信息,请参见   https://go.microsoft.com/fwlink/?linkid=2097913

NavMenu代码

List<Menu> menus = new List<Menu>();

protected override async Task OnInitializedAsync()
{ 
    menus  = await MenuService.GetMenus();

}

索引代码

@if (priorities == null)
{
    <p><em>Loading...</em></p>
}
else
{
    <table class="table">
        <thead>
            <tr>
                <th>Name</th> 
            </tr>
        </thead>
        <tbody>
            @foreach (var priority in priorities)
            {
                <tr>
                    <td>@priority.Name</td>
                </tr>
            }
        </tbody>
    </table>
}

@code { 
    List<Priority> priorities;

    protected override async Task OnInitializedAsync()
    { 
        priorities = await PriorityService.GetPriorities();

    }
}

3 个答案:

答案 0 :(得分:2)

看起来您正在为两个数据库请求共享同一个dbcontext实例,一次执行Index和NavMenu。

如果您正在使用DI,请检查是否可以使用transient代替范围。这将为每个组件创建新的dbcontext

已编辑 (由于评论)

Blazor是一项新技术,我认为它是blazorserver托管模型,它看起来更像是台式机应用程序而不是MVC,它们不只是实时客户端应用程序。我想我们站在需要重新思考许多概念的新挑战之前,请参见Daniel Roth(ASP.NET首席程序经理)关于how to deal with EF on Blazor的问题。

修改

也许仅使用transient是不够的,请参阅我对create a new scope for each request的回答。

答案 1 :(得分:0)

仅当我尝试从多个控件中的同一服务访问用户信息时,才会收到此错误。有道理——它们在初始化时都在争夺相同的资源。

对我来说,解决方案不是改变范围——而是重新思考我真正在做什么——为什么有 2 个单独的控件试图访问同一用户的会员功能?

答案 2 :(得分:-2)

我对 Blazor 服务器应用程序的解决方案是使 ApplictonDbContext 和服务都瞬态

services.AddDbContext<ApplicationDbContext>(x => x.UseSqlServer(connectionString), ServiceLifetime.Transient);
services.AddTransient<ICustomerService, CustomerService>();