通过Azure函数注入DbContext时无法访问已处置的对象

时间:2019-07-10 12:02:01

标签: 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)
    {
        _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*"));

我不知道为什么会发生此错误-通过return语句进行调试可以正常工作,并且可以在fundDailyPrices对象中看到数据,但是在return语句之后的某些操作意外终止了整个函数。

1 个答案:

答案 0 :(得分:1)

很难用您提供的代码来判断,但是最可能的罪魁祸首是直到上下文超出范围时才实现实例集。同样,我们看不到所有代码,但是当您执行诸如直接返回IQueryable之类的操作时,就会发生这种情况。任何类型的服务调用都应返回实例化列表(即在返回结果集之前调用ToList()ToListAsync())。如果您已启用该功能,则也可能是由于延迟加载引起的。如果是这样,您应该确保所有必要的关系都已准备就绪。

使用注入的上下文更新服务也很奇怪。您应该简单地注入服务,并且由于它对上下文具有构造函数依赖关系,因此它将自动注入其中。这样可以确保两个对象在相同或至少兼容的生存期内运行。

此外,请勿将IDisposable与注入的依赖项一起使用。我们无法提供有关您的服务类的任何信息,但是如果它确实实现了IDisposable,请删除它。