'操作无法完成,因为已经处理了DbContext'

时间:2016-02-16 16:13:15

标签: entity-framework

EF框架的新手,我只想努力解决问题。我只是尝试使用用户输入来提取数据库中的记录。

public class DataController : Controller
{

// GET: /Data/

    // /Data/GetTest
    // Test endpoint
    // Works 
    [HttpGet]
    public JsonResult GetTest()
    {
        test t = null;
        using (Database1Entities context1  = new Database1Entities()) 
        {
            t = context1.tests.OrderByDescending(a => a.Id).Take(1).FirstOrDefault();
        }
        JsonResult ret = new JsonResult { Data = t, JsonRequestBehavior = JsonRequestBehavior.AllowGet };
        return ret;
    }

    //This is the problem controller

    public JsonResult GetDataWithInput(test t) //test is a table with Id
    {                                          //and test1 fields

        using (Database1Entities context2 = new Database1Entities()) {
            var r = context2.tests.Where(a => a.test1.Equals(t.test1) && a.Id.Equals(t.Id));
            JsonResult ret = new JsonResult { Data = r, JsonRequestBehavior = JsonRequestBehavior.AllowGet };
            return ret;
        }

    }

}

/ Data / GetTest工作正常。这是第一个测试端点,没有问题。但是,当我添加用户输入以从/ Data / GetDataWithInput上的tests表中获取正确的记录时,我遇到了DbContext已被处理的错误。

2 个答案:

答案 0 :(得分:0)

在从数据库中实际读取结果之前,您的Database1Entities上下文已被释放。

使用EF时,不同的LINQ查询(Where()Take()等)只会构建一个SQL语句,一旦枚举结果就会执行(例如,当它们被显示时或序列化)。这称为LINQ查询的实现

在您的情况下,Web框架尝试序列化结果列表,从而触发执行构造的SQL语句。但到了发生的时候DbContext已经被处理掉了。

您可以通过调用ToList()来强制实现LINQ查询。

尝试在ToList()上致电r

public JsonResult GetDataWithInput(test t)
{
    using (Database1Entities context2 = new Database1Entities()) {
        ...
        JsonResult ret = new JsonResult { 
            // Note the ToList() here.
            Data = r.ToList(), 
            JsonRequestBehavior = JsonRequestBehavior.AllowGet };
        return ret;
    }
}

答案 1 :(得分:0)

当MVC框架实际将此对象转换为JSON时,您的DBContext已超出范围。

您需要调用IQueryable上的ToList()来完成查询并实际从数据库中获取结果。

我已修改下面的代码以调用ToList()

  using (Database1Entities context2 = new Database1Entities()) {
        var r = context2.tests.Where(a => a.test1.Equals(t.test1) && a.Id.Equals(t.Id));
        JsonResult ret = new JsonResult { Data = r.ToList(), JsonRequestBehavior = JsonRequestBehavior.AllowGet };
        return ret;
    }