我有几个返回 json 对象的操作方法,例如:
public JsonResult MyAction()
{
var entities = db.Entities.Include("Location").Where(e => e.Name != null);
var model = entities.Select(e => new MyModel(e));
return Json(model, JsonRequestBehavior.AllowGet);
}
在某些模型类中,我访问实体的内部元素,例如
public class MyModel
{
private Entity _e;
public MyModel(Entity e)
{
_e = e;
}
public string[] LocationName
{
get
{
return _e.Location.Name;
}
}
}
如果我将存储库 (db) 放在像 Global.asax.cs 文件中的 OnRequestDone 这样的地方,这就可以了。问题是现在我正在 BaseController 的 OnActionExecute 方法中处理数据库,当对象被序列化时,它会失败,因为连接已经关闭。
我的问题是,OnActionExecute是处理数据库连接的正确位置,还是应该在其他地方执行它?如果可以在那里处理存储库,那么我如何"强制"在我调用 Json(model) 的那一刻进行序列化,这样之后它就不会失败。
感谢您的帮助!
我认为真正的问题是你返回了一个需要连接的IQueryable。
最好确定何时执行查询,至少可以防止多次执行。
如果强制执行,则已经有了结果,并且可以毫无问题地处置数据库。
例:
public JsonResult MyAction()
{
var entities = db.Entities.Include("Location").Where(e => e.Name != null);
var model = entities.Select(e => new MyModel(e))
.ToList(); // Execute IQueryable to get List<MyModel>
return Json(model, JsonRequestBehavior.AllowGet);
}