.NET8 Blazor结合Microsoft Identity时DbContext并发操作异常求助
.NET 8 Blazor中DbContext并发操作异常问题
场景与操作步骤
- 使用Visual Studio 2022 Preview模板创建基于.NET 8框架和Blazor的网站,已修改
ApplicationUser类添加新属性:
public string? FirstName { get; set; } public string? LastName { get; set; }
- 在
Components > Pages > Account > Manage下的Index.razor中实现用户修改上述属性的功能,保存逻辑代码如下:
if (Input.FirstName != _firstname) { _user.FirstName = Input.FirstName; await UserManager.UpdateAsync(_user); }
- 在
NavMenu.razor中注入UserManager<ApplicationUser>,并通过以下代码在导航栏显示用户的FirstName或用户名:
@inject UserManager<ApplicationUser> usermanager <AuthorizeView> <Authorized> <div class="nav-item px-3"> <NavLink class="nav-link" href="/Account/Manage"> <span class="bi bi-person-fill" aria-hidden="true"></span> @(usermanager.GetUserAsync(context.User).Result.FirstName ?? context.User.Identity?.Name) </NavLink> </div> </Authorized> </AuthorizeView>
首次出现的错误
当保存FirstName的新值时,NavMenu.razor中立即抛出异常:
InvalidOperationException: 此上下文实例上已启动第二个操作,前一个操作尚未完成。通常是由于不同线程同时使用同一个DbContext实例导致的。有关如何避免DbContext线程问题的详细信息,请参阅官方文档。
注:相同代码在.NET 7 Blazor应用中可正常运行。
更新后的问题
修改NavMenu.razor,将用户信息获取逻辑移至OnInitializedAsync异步方法中:
@code { private string? Username; protected override async Task OnInitializedAsync() { var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync(); var user = authState.User; if (user.Identity.IsAuthenticated) { var fulldetails = await usermanager.GetUserAsync(user); Username = fulldetails.FirstName ?? user.Identity.Name; } } }
修改后保存更新操作可成功执行,但点击任何页面链接时仍会抛出相同的异常:
InvalidOperationException: 此上下文实例上已启动第二个操作,前一个操作尚未完成。通常是由于不同线程同时使用同一个DbContext实例导致的。有关如何避免DbContext线程问题的详细信息,请参阅官方文档。
Microsoft.EntityFrameworkCore.Infrastructure.Internal.ConcurrencyDetector.EnterCriticalSection()
内容的提问来源于stack exchange,提问作者Enrico
相关产品推荐
相关产品推荐

