2012-04-27 12 views
2

jsonオブジェクトを返すアクションメソッドがいくつかあります。例えば、ASP.NET MVC:コントローラアクションを終了する前に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); 
} 

いくつかのモデルクラスでは、Iはエンティティの内部要素にアクセスします。

public class MyModel 
{ 
    private Entity _e; 
    public MyModel(Entity e) 
    { 
    _e = e; 
    } 

    public string[] LocationName 
    { 
    get 
    { 
     return _e.Location.Name; 
    } 
    } 
} 

Global.asax.csファイルでOnRequestCompletedのような場所でのIリポジトリ(デシベル)場合、これはうまく動作します。 問題は、今はBaseControllerのOnActionExecutedメソッドにdbを配置していて、オブジェクトがシリアル化されているときにbcが失敗した場合、接続はすでに閉じられているということです。

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

ありがとうございました!

答えて

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); 
} 
+1

は、実際にはそれが唯一のエンティティではなく、場所を取得します)私は(ToListメソッドを使用している場合でも、正確に真実ではないのです。場所は、アクセスされると取得されます。この場合は、シリアライゼーションが発生します。 – willvv

+1

これは、熱心な読み込みが機能していないことを意味しています。これは、遅延ロードされたプロパティとして扱われます。これは別の問題です。あなたのモデルからエンティティを離陸しようとしましたが、選択したラムダにプロパティが割り当てられていますか? – Meligy

関連する問題