EF错误:在前一个异步操作完成之前,在此上下文中开始了第二个操作



我是Blazor的新手,在服务器端Blazor应用程序中工作。. NET 5)有以下内容:

我有下面的表格:

<EditForm Model="@MyObject" OnValidSubmit="Submit">
<DataAnnotationsValidator />
<ValidationSummary />
<InputText id="name" @bind-Value="MyObject.Name" />
<button type="submit">Submit</button>
</EditForm>

背后的代码:

public MyObject MyObject { get; set; } = new MyObject();

[Inject]
private IMyObjectService myObjectService { get; set; }
[Inject]
private NavigationManager navigationManager { get; set; }
void Submit()
{
var created = myObjectService.CreateMyObject(MyObject);
if (created != null)
{
navigationManager.NavigateTo("myobjects/manage");
} else
{
// do something
}
}
回购:

private readonly ApplicationDbContext _dbContext;
public MyObjectRepo(ApplicationDbContext dbContext)
{
_dbContext = dbContext;
}
public async Task<MyObject> CreateMyObject(MyObject MyObject)
{
_dbContext.Add(MyObject);
await _dbContext.SaveChangesAsync();
return MyObject;
}
public async Task<bool> DoesMyObjectExistByName(string name)
{
var exists = await _dbContext.MyObjects.AnyAsync(x => x.Name == name);
if (exists) return true;
return false;
}

我有一个MyObjectService:

private readonly IMyObjectRepo _myObjectRepo ;

public MyObjectService(IMyObjectRepo myObjectRepo  )
{
_myObjectRepo  = myObjectRepo;
}
public async Task<MyObject> CreateMyObject(MyObject MyObject)
{
if (MyObject == null) throw new ArgumentNullException("MyObject cannot be null.");
// THIS LINE THROWS THE EF ERROR
var exists = await _myObjectRepo.DoesMyObjectExistByName(MyObject.Name);
if (!exists)
{
return await _myObjectRepo.CreateMyObject(MyObject);
} else
{
return null;
}
}

但是每次我调用服务的createMyObject方法,EF抛出一个错误:

错误:系统。InvalidOperationException:第二个操作是在上一个操作完成之前在此上下文中启动。这是通常是由不同的线程并发地使用同一个线程引起的

在Startup.cs中. NET 5),我配置了瞬态生存期。

services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("Default")),
ServiceLifetime.Transient);
services.AddAutoMapper(typeof(Startup));
services.AddScoped<IMyObjectRepo, MyObjectRepo>();
services.AddScoped<IMyObjectService, MyObjectService>();

我想我正在使用所有正确的语法异步/等待和线程安全,有什么想法吗?

我自己不熟悉Blazor,但我认为您的Submit方法应该看起来像-

async void Submit()
{
var created = await myObjectService.CreateMyObject(MyObject);
if (created != null)
{
navigationManager.NavigateTo("myobjects/manage");
} else
{
// do something
}
}

基本上,你错过了async/await关键字。

最新更新