Asp.net core 通过Azure函数注入DbContext时无法访问已释放的对象

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

尝试将DbContext注入Azure函数时,我收到以下错误:

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,假设它不拥有任何依赖项。上下文正在被注入,因此服务类绝对不应该处理上下文,因为它不拥有上下文。