同时在两个地方使用的 DbContext 实例 - EF - Hangfire



我正在使用EF Core和Hangfire来运行重复作业。杭火似乎导致以下错误:

在上

一个操作之前在此上下文上启动第二个操作 完成。这通常是由不同的线程使用相同的线程引起的 DbContext 的实例。有关如何避免线程的详细信息 数据库上下文的问题

和。。我不知道为什么。我按如下方式注册 EF 上下文:

services 
.AddDbContext<PaymentContext>(options => options.UseNpgsql(connectionString),
ServiceLifetime.Transient); 

然后。。

app.UseHangfireDashboard();
app.UseHangfireServer();

RecurringJob.AddOrUpdate(() => myService.ExecuteMyJob(), Cron.Minutely);

其中 myService 已注入Startup.Configure函数,并且 myService 包含对DbContext的引用。这在理论上是暂时的,因此不应由服务和其他地方共享。

但是,堆栈跟踪导致此处:

var plans = _context.Plan
.Include(pp => pp.PlanItem)
.Where(pp => pp.PolicyId == policyId)
.ToList() // materialise query
.OrderBy(pp => pp.PlanItem.First().Date)
.ToList();

您应该为依赖项创建范围。

public class Job
{
private readonly IServiceProvider _serviceProvider;

public Job(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
public void ExecuteJob()
{
using (var scope = serviceProvider.CreateScope())
{
var databaseContext = scope.ServiceProvider.GetRequiredService<DatabaseContext>();
// do something
}
}
}

最新更新