2016-02-16 4 views
1

Новое в EF-каркасе, и я просто пытаюсь понять. Я просто пытаюсь использовать пользовательский ввод, чтобы вытащить запись в db.«Операция не может быть завершена, потому что DbContext был удален»

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; 
     } 

    } 

} 

The/Data/GetTest отлично работает. Это была первая контрольная точка тестирования и проблем там не было. Однако, когда я добавил пользовательский ввод, чтобы получить правильную запись из таблицы тестов в/Data/GetDataWithInput, я был поражен ошибкой, которую удалил DbContext.

+1

Попробуйте с помощью 'Data = r.ToList()' – haim770

+0

Это сработало, спасибо @ haim770 – pbordeaux

ответ

0

Контекст Database1Entities расположен до того, как результат фактически будет считан из базы данных.

При использовании EF различные запросы LINQ (Where(), Take() и т. Д.) Создают только инструкцию SQL, которая выполняется, как только результаты перечисляются (например, когда они отображаются или сериализуются). Это называется материализация запроса LINQ.

В вашем случае веб-каркас пытается сериализовать список результатов, который запускает выполнение построенного оператора SQL. Но к тому времени, когда это произойдет, DbContext уже установлен.

Вы можете принудительно осуществить материализацию запроса LINQ, вызвав на нем ToList().

Попробуйте позвонить 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; 
    } 
} 
0

К тому времени, рамки MVC получает вокруг на самом деле превратить этот объект в JSON, ваш DbContext вышел за рамки.

Вам необходимо вызвать ToList() на IQueryable, чтобы завершить запрос и получить результаты из базы данных.

Я изменил код ниже, чтобы позвонить 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; 
    } 
Смежные вопросы