在此上下文中开始第二次操作

时间:2018-11-04 08:09:18

标签: c# asp.net entity-framework

在保存到数据库的日期之后,我在控制器中执行了另一个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 :(得分:5)

最短的修复方法:

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

稍微好一点的选项:

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

您没有在等待对SaveChangesAsync()的调用,这意味着(可以)在单独的线程上进行分叉。然后它给你这个错误,一个DbContext无法在线程之间共享。

作为练习,您可以对SavePost()方法进行类似的更改:

  • 将其设为async Task方法
  • await db.SaveChangesAsync()替换SaveChanges()
  • 等待对SavePost()的调用