2

我有几个返回 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 文件中的 OnRequestCompleted 之类的地方,这工作得很好。问题是现在我在 BaseController 的 OnActionExecuted 方法中处理数据库,并且当对象被序列化时它失败 bc 连接已经关闭。

我的问题是, OnActionExecuted 是处理数据库连接的正确位置还是应该在其他地方执行它?如果可以在那里放置存储库,那么我如何“强制”序列化在我调用 Json(model) 的那一刻发生,这样它之后就不会失败。

谢谢你的帮助!

4

1 回答 1

1

我认为真正的问题是您要返回一个需要连接的 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);
}
于 2012-04-27T05:21:24.283 回答