C# 实体框架核心与多线程

C# 实体框架核心与多线程,c#,asp.net,multithreading,entity-framework,asp.net-core,C#,Asp.net,Multithreading,Entity Framework,Asp.net Core,在我的ASP.NET核心应用程序中,我有一些复杂的业务逻辑,涉及多个线程在HTTP请求范围之外执行数据库操作。从处理请求的同一线程访问数据库是很简单的,但是当生成需要自己的DbContext的线程时,这会变得很乏味。由于DbContext本身不是线程安全的,除了从IServiceProvider获取DbContext之外,我还尝试创建一个新的DbContext及其选项。对于这两种方法,我得到以下例外情况: 试图在配置上下文时使用该上下文。A. DbContext实例无法在OnConfiguran

在我的ASP.NET核心应用程序中,我有一些复杂的业务逻辑,涉及多个线程在HTTP请求范围之外执行数据库操作。从处理请求的同一线程访问数据库是很简单的,但是当生成需要自己的DbContext的线程时,这会变得很乏味。由于DbContext本身不是线程安全的,除了从IServiceProvider获取DbContext之外,我还尝试创建一个新的DbContext及其选项。对于这两种方法,我得到以下例外情况:

试图在配置上下文时使用该上下文。A. DbContext实例无法在OnConfigurang中使用,因为它是 此时仍在配置中


我得到的印象是,我以错误的方式处理这个问题,我不应该像这样处理数据库连接。那么,我应该如何从处理传入请求的线程中获得一个单独线程中的DbContext呢?

事实证明,我的测试代码有一个小错误,使得它在所有线程中使用相同的DbContext。但是,我需要创建一个新的DbContext实例,但我无法通过问题中提到的IServiceProvider获得一个实例。

我测试过,它可以工作:

var optionsBuilder = new DbContextOptionsBuilder<ApplicationDbContext>();
                            optionsBuilder.UseSqlServer(DbConnectionString);

                            using (var context = new ApplicationDbContext(optionsBuilder.Options))
                            {

                                //save or update() on *context* here
                            }
var optionsBuilder=new DbContextOptionsBuilder();
optionsBuilder.UseSqlServer(DbConnectionString);
使用(var context=newapplicationdbcontext(optionsBuilder.Options))
{
//在此处*上下文*上保存或更新()
}

在您使用的每个线程中创建DbContext的新实例。DbContext不是线程安全的。能否提供一段代码?