Не удается получить доступ к удаленному объекту при внедрении DbContext через функцию Azure - PullRequest
0 голосов
/ 10 июля 2019

При попытке вставить 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 Ответ

1 голос
/ 10 июля 2019

Трудно сказать по предоставленному вами коду, но наиболее вероятный виновник в том, что вы не материализуете набор результатов, пока контекст не выйдет из области видимости.Опять же, мы не можем увидеть весь код, но это происходит, когда вы делаете такие вещи, как возврат IQueryable напрямую.Любой тип сервисного вызова должен возвращать материализованный список (т. Е. Вызвать ToList() или ToListAsync() в наборе результатов перед возвратом).Это также может быть вызвано отложенной загрузкой, если вы включили эту функцию.Если это так, вам следует убедиться, что все необходимые отношения загружены с нетерпением.

Также странно, что вы обновляете свой сервис с введенным контекстом.Вы должны просто внедрить свой сервис, и, поскольку он зависит от вашего контекста, конструктор будет автоматически внедрен в него.Это гарантирует, что оба объекта работают в одном или, по крайней мере, совместимом времени жизни.

Кроме того, не используйте IDisposable с внедренными зависимостями.Мы ничего не можем рассказать о вашем классе обслуживания, но если он реализует IDisposable, удалите его.

...