我动态创建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();
}
}
答案 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>();