相关疑难解决方法(0)

将Dbcontext配置为瞬态

在ASP.NET Core/EntityFramework Core中,services.AddDbContext <>方法将指定的上下文添加为作用域服务.我的理解是,这是Microsoft建议的dbcontext生命周期管理.

然而,我们的工程师部门对此有很多争论,许多人认为需要尽快处理上下文.那么,将dbcontext配置为Transient仍然保持通常使用的相同Repository模式(即将上下文直接注入存储库的构造函数)以及支持灵活的单元测试的最佳方法是什么?

c# entity-framework-core asp.net-core

22
推荐指数
2
解决办法
1万
查看次数

使用 Entity Framework Core 的 Blazor 并发问题

我的目标

我想创建一个新的 IdentityUser 并显示已通过同一个 Blazor 页面创建的所有用户。该页面有:

  1. 通过您的表单将创建一个 IdentityUser
  2. 第三方的网格组件 (DevExpress Blazor DxDataGrid),它显示使用 UserManager.Users 属性的所有用户。此组件接受 IQueryable 作为数据源。

问题

当我通过表单 (1) 创建一个新用户时,我会收到以下并发错误:

InvalidOperationException:在上一个操作完成之前,在此上下文中启动了第二个操作。不保证任何实例成员都是线程安全的。

我认为问题与CreateAsync(IdentityUser user)UserManager.Users指的是相同的 DbContext 的事实有关

该问题与第三方的组件无关,因为我重现了相同的问题,并用一个简单的列表替换了它。

重现问题的步骤

  1. 使用身份验证创建一个新的 Blazor 服务器端项目
  2. 使用以下代码更改 Index.razor:

    @page "/"
    
    <h1>Hello, world!</h1>
    
    number of users: @Users.Count()
    <button @onclick="@(async () => await Add())">click me</button>
    <ul>
    @foreach(var user in Users) 
    {
        <li>@user.UserName</li>
    }
    </ul>
    
    @code {
        [Inject] UserManager<IdentityUser> UserManager { get; set; }
    
        IQueryable<IdentityUser> Users;
    
        protected override void OnInitialized()
        {
            Users = UserManager.Users;
        } …
    Run Code Online (Sandbox Code Playgroud)

entity-framework-core asp.net-core blazor blazor-server-side

10
推荐指数
1
解决办法
3166
查看次数

Blazor 服务器和 EF Core:在上一个操作完成之前,已在此上下文实例上启动第二个操作

我的 ef 核心有问题。我有两个从数据库读取数据的服务。在一个页面上调用第一个服务,在第二个页面上调用第二个服务。当我单击按钮创建新程序时,出现错误。我通常从带有注入服务的页面调用它。有人可以帮我吗?

在应用程序中显示

builder.Services.AddDbContextPool<Context>(options =>
{ 
options.UseSqlServer(builder.Configuration.GetConnectionString("Connection"));
});
Run Code Online (Sandbox Code Playgroud)

测试服务1:

public class TestService1 : ITestService1
{
    private readonly Context _context;
    private readonly IMapper _mapper;

    public TestService1(Context context, IMapper mapper)
    {
        _kreativgangContext = kreativgangContext;
        _mapper = mapper;
    }

    public virtual async Task<AllProgramViewModel> HandleAsync(AllProgramFilterViewModel filter)
    {
        var model = new AllProgramViewModel();

        var data = _context.Programs.Where(x => (EF.Functions.Like(x.Name ?? "", "%" + filter.Name + "%") || string.IsNullOrEmpty(filter.Name)))
            .Select(x => new Core.Models.Program() { ID = x.ID, Name = x.Name, Order = x.Order });

        result.Model.TotalCount …
Run Code Online (Sandbox Code Playgroud)

c# entity-framework-core blazor-server-side

2
推荐指数
1
解决办法
5365
查看次数

异步方法:在上一个操作完成之前在此上下文上启动第二个操作

我是 Blazor 的新手,没有太多使用任务的经验,所以希望我只是犯了一个愚蠢的错误。我有一个通过按下按钮调用的异步方法,但如果在 1-2 秒内再次调用该方法,我会收到以下异常。

Error: System.InvalidOperationException: A second operation was started on this context before a previous operation completed. This is usually caused by different threads concurrently using the same instance of DbContext. For more information on how to avoid threading issues with DbContext, see https://go.microsoft.com/fwlink/?linkid=2097913.
Run Code Online (Sandbox Code Playgroud)

此按钮针对“用户”表中的每一行呈现。我试图快速连续删除多个用户记录,但收到上述错误。

这是按下按钮的代码(使用 AntBlazor)

 <Button Type="primary" Danger OnClick="@(async() => await RemoveAsync(user))">Remove User</Button>
Run Code Online (Sandbox Code Playgroud)

这是RemoveAsync 方法的代码。

private async Task RemoveAsync(User user)
{
   await UserService.UpdateUserAsync(user);
}
Run Code Online (Sandbox Code Playgroud)

我是否误解了 async/await 的工作原理?或者我是否需要利用任务来确保操作完成?

编辑:

这是 UserService.UpdateUserAsync() 代码

public async Task<bool> UpdateUserAsync(User …
Run Code Online (Sandbox Code Playgroud)

.net c# blazor blazor-server-side

0
推荐指数
1
解决办法
1万
查看次数