Asp.net core 通过Azure函数注入DbContext时无法访问已释放的对象
尝试将DbContext注入Azure函数时,我收到以下错误:Asp.net core 通过Azure函数注入DbContext时无法访问已释放的对象,asp.net-core,entity-framework-core,azure-functions,Asp.net Core,Entity Framework Core,Azure Functions,尝试将DbContext注入Azure函数时,我收到以下错误: Microsoft.EntityFrameworkCore: Cannot access a disposed object. 下面是当前函数 private readonly FundCentreContext _fundCentreContext; public GetDailyPrices(FundCentreContext fundCentreContext) { _fundCen
Microsoft.EntityFrameworkCore: Cannot access a disposed object.
下面是当前函数
private readonly FundCentreContext _fundCentreContext;
public GetDailyPrices(FundCentreContext fundCentreContext)
{
_fundCentreContext = fundCentreContext;
}
[Produces("application/json")]
[FunctionName(nameof(GetDailyPrices))]
public IActionResult Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "api/dailyprices")] HttpRequest req,
ILogger log)
{
//Parameters
var parameters = req.GetQueryParameterDictionary();
var page = int.Parse(parameters.GetValueOrDefault("page", "0"));
var limit = int.Parse(parameters.GetValueOrDefault("limit", "10"));
var offset = int.Parse(parameters.GetValueOrDefault("offset", "0"));
var sort = parameters.GetValueOrDefault("sort", "asc");
var fundService = new FundService(_fundCentreContext);
var fundDailyPrices = fundService.GetAllDailyPricesByPage(page, limit, offset);
return fundDailyPrices != null
? (ActionResult)new OkObjectResult(fundDailyPrices)
: new BadRequestObjectResult("There was an error with your request");
}
并且,使用该服务的启动程序具有以下代码:
services
.AddDbContext<FundCentreContext>(options =>
options.UseSqlServer("*ommited*"));
服务
.AddDbContext(选项=>
选项。使用SQLServer(“*ommited*”);
我不知道为什么会发生此错误-在返回语句之后进行调试可以正常工作,并且可以在fundDailyPrices对象中看到数据,但是在返回语句意外结束整个函数之后,有些事情发生了。很难用您提供的代码来判断,但最可能的罪魁祸首是,在上下文超出范围之前,您不会具体化结果集。同样,我们无法看到所有的代码,但是当您直接返回
IQueryable
之类的操作时,就会发生这种情况。任何类型的服务调用都应该返回一个物化列表(即在返回之前对结果集调用ToList()
或ToListAsync()
)。如果您启用了该功能,那么它也可能是由延迟加载引起的。如果是这样,你应该确保所有必要的关系都被急切地加载
使用注入上下文更新服务也很奇怪。您应该简单地注入您的服务,因为它对您的上下文有一个构造函数依赖关系,它将自动注入其中。这确保了两个对象在相同或至少兼容的生存期内运行
另外,不要将
IDisposable
与注入的依赖项一起使用。我们无法告诉您的服务类的任何信息,但如果它确实实现了IDisposable
,请删除它。您的GetAllDailyPricesByPage
函数是async
?如果没有等待任何内容,为什么要使用async Task
?我打算将wait添加到GetAllDailyPricesByPage()函数中,但目前它不是异步的。我编辑了问题并删除了async以消除混淆。同步函数仍然会发生错误。用EF注入DbContext不是很标准吗?我不确定你为什么不注射一次性的东西。你把不同的东西混为一谈了。这里的问题不是注入服务,不是注入上下文。当然应该注入上下文,但是当使用DI时,应该注入链上下的所有内容。第二个问题是在服务类上实现IDisposable,假设它不拥有任何依赖项。上下文正在被注入,因此服务类绝对不应该处理上下文,因为它不拥有上下文。