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

Global.asax.cs ファイルの OnRequestCompleted のような場所にリポジトリ (db) がある場合、これは問題なく機能します。問題は、現在、BaseController の OnActionExecuted メソッドでデータベースを破棄していることです。オブジェクトがシリアル化されているときに、接続が既に閉じられているために失敗します。

私の質問は、OnActionExecuted はデータベース接続を破棄する正しい場所ですか、それとも別の場所で実行する必要がありますか? そこにリポジトリを配置しても問題ない場合は、 Json(model) を呼び出した瞬間にシリアル化を「強制」して、後で失敗しないようにするにはどうすればよいですか。

ご協力いただきありがとうございます!

4

1 に答える 1

1

本当の問題は、接続が必要なIQueryableを返すことだと思います。

少なくとも複数の実行を防ぐために、クエリをいつ正確に実行するかを決定することをお勧めします。

強制的に実行すれば、すでに結果が出ており、DBを問題なく破棄できます。

例:

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 に答える