在Entity Framework中使用DbContext运行异步调用

时间:2015-03-10 20:05:39

标签: c# .net entity-framework asp.net-web-api dbcontext

我希望能够按如下方式运行异步调用:

[Route("doit"),ResponseType(typeof(MyModel))]
public IHttpResponse PostAsyncCall(MyModel model){
    //Code removed for simplicity

    Task.Factory.StartNew(() => asyncStuff(model.id);

    return OK(model);
}

private void asyncStuff(int id) {
    MyModel model = db.MyModels.find(id);
    //Do things here. Long call to other webservices/processing of data. Time intensive normally.
    User user = db.Users.find(model.userId);
    //Do more things. Time intensive normally.
}

但是,当异步方法遇到db.方法时,会发生错误:

  

EntityFramework.dll中出现'System.InvalidOperationException'类型的异常,但未在用户代码中处理

     

附加信息:由于DbContext已被处理,因此无法完成操作。

使用的上下文是:

public class MyContext : DbContext, MyContextInterface
{
        // You can add custom code to this file. Changes will not be overwritten.
        // 
        // If you want Entity Framework to drop and regenerate your database
        // automatically whenever you change your model schema, please use data migrations.
        // For more information refer to the documentation:
        // http://msdn.microsoft.com/en-us/data/jj591621.aspx

        public MyContext() : base("name=MyContext")
        {
        }

        public System.Data.Entity.DbSet<MyAPI.Models.User> Users { get; set; }

        public System.Data.Entity.DbSet<MyAPI.Models.Request> Requests { get; set; }

        public void MarkAsModified(Object item)
        {
            Entry(item).State = EntityState.Modified;
        }

    }

通过以下方式在控制器中将上下文创建为类变量:

private MyContextInterface db = new MyContext();

我可以看到在方法结束时正在处理db上下文;但是,我需要在异步方法的持续时间内保留此上下文以访问所需的信息。我怎么能这样做?

1 个答案:

答案 0 :(得分:6)

你开始一项任务,但你没有等待它,所以你可以立即调用OK。 当长时间运行的任务完成时,确实会丢弃您的数据库上下文。 只需添加等待即可解决您的问题。