C# 实体框架核心-在尝试运行第二个查询时释放
我在处理数据库上下文时遇到问题。我在Configure services方法中设置了如下数据库。代码已经简化,希望更易于阅读C# 实体框架核心-在尝试运行第二个查询时释放,c#,entity-framework-core,C#,Entity Framework Core,我在处理数据库上下文时遇到问题。我在Configure services方法中设置了如下数据库。代码已经简化,希望更易于阅读 public void ConfigureServices(IServicesCollection services) { Services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString(
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
,但这取决于他们。我不确定这是否属实。单个请求的生存期与对数据库的单个调用不同。