Вторая операция началась в этом контексте - PullRequest
0 голосов
/ 04 ноября 2018

В моем контроллере я выполняю другую функцию Void после даты, сохраненной в БД. Но иногда это показывает эту ошибку:

Вторая операция началась в этом контексте перед предыдущей Асинхронная операция завершена. Используйте «ожидание», чтобы убедиться, что любой асинхронные операции завершены перед вызовом другого метода в этом контексте. Любые члены экземпляра не гарантированно являются потоками сейф.

... и вот пример моего контроллера:

public ActionResult All(Chapter chapter){

    var x = db.Post.Where(p => p.PostID == chapter.PostID).FirstOrDefault();
    if (x == null){return View(chapter);}

    counter++;

    db.Chapter.Add(chapter);
    db.SaveChangesAsync();                      

    savepost(chapter.PostID, counter);

    return RedirectToAction("Index");
}

и вот метод Void:

public void savepost(int id,int counter)
{
    var article = db.Post.Find(id);
    article.LastUpdate = DateTime.Now;
    article.ChapterCount = counter;

    db.Entry(article).State = EntityState.Modified;
    db.SaveChanges();
}

Как я могу решить это?

1 Ответ

0 голосов
/ 04 ноября 2018

Самое короткое исправление:

//db.SaveChangesAsync(); 
db.SaveChanges(); 

немного лучший вариант:

public async Task<ActionResult> All(Chapter chapter)
{
   ....
   await db.SaveChangesAsync(); 
   ...
}

Вы не ожидали вызова SaveChangesAsync (), то есть он (может) будет отключен в отдельном потоке. И затем это дает вам эту ошибку, DbContext не может быть разделен между потоками.

В качестве упражнения вы можете внести аналогичное изменение в метод SavePost ():

  • сделать это async Task метод
  • заменить SaveChanges () на await db.SaveChangesAsync()
  • жду звонка в SavePost ()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...