C# 实体框架核心-在尝试运行第二个查询时释放

C# 实体框架核心-在尝试运行第二个查询时释放,c#,entity-framework-core,C#,Entity Framework Core,我在处理数据库上下文时遇到问题。我在Configure services方法中设置了如下数据库。代码已经简化,希望更易于阅读 public void ConfigureServices(IServicesCollection services) { Services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString(

我在处理数据库上下文时遇到问题。我在Configure services方法中设置了如下数据库。代码已经简化,希望更易于阅读

public void ConfigureServices(IServicesCollection services)
{
      Services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("Database1")));
      Services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("Database2")));
      Services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("Database3")));
      Services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("Database4")));

      Services.AddScoped<IQueryService1, ConcreteService1>();
      Services.AddScoped<IQueryService1, ConcreteService2>();
      Services.AddScoped<IQueryService1, ConcreteService3>();
      Services.AddScoped<IQueryService1, ConcreteService4>();
}
public void配置服务(iSeries收集服务)
{
Services.AddDbContext(options=>options.UseSqlServer(Configuration.GetConnectionString(“Database1”));
Services.AddDbContext(options=>options.UseSqlServer(Configuration.GetConnectionString(“Database2”));
Services.AddDbContext(options=>options.UseSqlServer(Configuration.GetConnectionString(“Database3”));
Services.AddDbContext(options=>options.UseSqlServer(Configuration.GetConnectionString(“Database4”));
Services.addScope();
Services.addScope();
Services.addScope();
Services.addScope();
}
现在,我在其中一个控制器中注入了所需的相关服务

[Produces("application/json")]
[Route("api/[controller]/[action]
public class DigitalFinesController : Controller
{
      private readonly IQueryService1 _Service1;

      public DigitalFinesController(IConfiguration configuration, IQueryServices1 QueryService1)
      {
         _Service1 = QueryService1;
      }

      [Authorize]
      [HttpPost]
      [ActionName("SubmitFine")]
      [ProducesResponseType(200)]
      [ProducesResponseType(401)]
      public async Task<IActionResult> SubmitFine([FromBody] Models.DigitalFine fine)
      {
         //This is a simple version of my issue
         var vehicles = _Service1.Vehicles.FirstOrDefault(p=> p.vrm == "OX7 DFG");
         if(vehicle == null)
         {
            return BadRequest("Vehicle is missing");
         }

         var fleet = _Service1.Fleets.FirstOrDefault(p=> p.Code = "MyCode");
      }
}
[产生(“应用程序/json”)]
[路由(“api/[控制器]/[操作]
公共类DigitalFinesController:控制器
{
专用只读IQueryService1_Service1;
公共数字精细控制器(I配置配置,IQueryServices1查询服务1)
{
_服务1=查询服务1;
}
[授权]
[HttpPost]
[ActionName(“SubmitFine”)]
[产品响应类型(200)]
[产品响应类型(401)]
公共异步任务SubmitFine([FromBody]Models.DigitalFine)
{
//这是我的问题的一个简单版本
var车辆=_Service1.vehicles.FirstOrDefault(p=>p.vrm==“OX7 DFG”);
如果(车辆==null)
{
退货请求(“车辆丢失”);
}
var fleet=_Service1.Fleets.FirstOrDefault(p=>p.Code=“MyCode”);
}
}
一旦进入第二个查询,就会出现以下异常

System.ObjectDisposedException:'无法访问已处置的对象。此错误的常见原因是处置通过依赖项注入解析的上下文,然后稍后尝试在应用程序中的其他位置使用相同的上下文实例。如果调用Dispose(),则可能会发生这种情况或将上下文包装到using语句中。如果使用依赖项注入,则应让依赖项注入容器处理上下文实例

我很难理解为什么会发生这种情况。有人能给我一个指针来解决这个问题吗

非常感谢
Simon

我认为这可能与您注册它的方式有关。请尝试使用
AddSingleton
而不是
AddScoped
注册它

范围限定

每个请求创建一次作用域生存期服务

警告

在中间件中使用作用域服务时,将服务注入Invoke或
InvokeAsync
方法。不要通过构造函数注入进行注入,因为它会强制服务表现为单例。有关详细信息,请参阅ASP.NET核心中间件

单身人士

单例生存期服务是在第一次被请求时创建的(或者当运行
ConfigureServices
并使用服务注册指定实例时)。每个后续请求都使用相同的实例。如果应用程序需要单例行为,建议允许服务容器管理服务的生存期。不要实现单例设计模式,并在类中提供用户代码来管理对象的生存期

警告


从单例解析作用域服务是危险的。这可能会导致服务在处理后续请求时状态不正确。

。AddScoped
将在请求生存期后处理,请尝试更改为
单例
瞬态

请参阅文件:

在本节:

在示例应用程序中,imydependence服务在 具体类型MyDependency。注册作用域为服务 生存期到单个请求的生存期。服务生存期为 本主题后面将介绍

警告

在中间件中使用作用域服务时,将服务注入到 Invoke或InvokeAsync方法。不要通过构造函数注入 注入,因为它强制服务像单例一样运行。 有关更多信息,请参阅ASP.NET核心中间件


你和我用不同的文档得到了相同的答案。+1 OP也可以使用
Transient
而不是
singleton
,但这取决于他们。我不确定这是否属实。单个请求的生存期与对数据库的单个调用不同。