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已被处理的错误。
答案 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;
}