Операция не может быть завершена, поскольку исключение DbContext было удалено

#c# #asp.net #asp.net-mvc #entity-framework #dbcontext

#c# #asp.net #asp.net-mvc #entity-framework #dbcontext

Вопрос:

Я пытаюсь добавить экземпляр модели, заполненный значениями, в базу данных, но он показывает мне ошибку

«Операция не может быть завершена, поскольку DbContext был удален».

Вот мой код

 private async void timerHandlerFixerIO(object sender, EventArgs e)
    {
        string html = string.Empty;
        string url = @"http://api.fixer.io/latest";

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        request.AutomaticDecompression = DecompressionMethods.GZip;

        using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
        using (Stream stream = response.GetResponseStream())
        using (StreamReader reader = new StreamReader(stream))
        {
            html = reader.ReadToEnd();
        }

        Debug.WriteLine(html);
        FixerIO FixerIOInstance = new FixerIO();
        FixerIOInstance.rates = new rates();
        FixerIOInstance = JsonConvert.DeserializeObject<FixerIO>(html);
        db.FixerIOs.Add(FixerIOInstance);
        await db.SaveChangesAsync();

    }
  

При выполнении этой строки появляется всплывающее окно исключения ошибки

 db.FixerIOs.Add(FixerIOInstance);
  

и мое DbContext объявление вне timerHandlerFixerIO метода, например

 private ApplicationDbContext db = new ApplicationDbContext();
  

Комментарии:

1. Вместо того, чтобы добавлять примечание о вашем стиле написания, почему бы просто не исправить его на обычный английский?

2. где db объявлено?

3. Его внутренний контроллер

4. Где-то еще удаляет контекст БД перед timerHandlerFixerIO выполнением.

5. @AliJamal, я думаю timerHandlerFixerIO , запускается таймером или чем-то еще, контекст БД в это время недоступен. Если мое предположение верно, вы не должны помещать таймер внутри контроллера.

Ответ №1:

Вы можете DbContext снова использовать этот способ

 using(var db = new ApplicationDbContext())
{
   db.FixerIOs.Add(FixerIOInstance);
   await db.SaveChangesAsync();
}
  

Комментарии:

1. Да, это сработало, спасибо, теперь значения сохраняются в базе данных при каждой итерации тика таймера Большое вам спасибо, я бы сам не понял этого, спасибо