2016-06-13 2 views
0

モデルをJSON文字列に変換しようとしています。この特定のビューでKnockoutバインディングを使用したいと思います。RazorのHtml.Raw()でObjectContextインスタンスが破棄されました

まず第一に、私はそうのように、JSON文字列にモデルを変換しよう:最後の行(実際の変換)では

@{ 
    var serializerSettings = new Newtonsoft.Json.JsonSerializerSettings(); 
    serializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore; 
    var jsonData = @Html.Raw(Newtonsoft.Json.JsonConvert.SerializerObject(Model, serializerSettings)); 
} 

、次のエラーが発生します。

ObjectContextインスタンスが破棄され、接続が必要な操作にもはや使用することはできません。

私のコントローラは、DBからオブジェクトを取得するだけで、

public ActionResult Partner(int id) 
{ 
    using(var db = new DatabaseContext()) 
    { 
     var partner = db.Partners 
      .Include(x => x.OperatingCountries) 
      .Include(x => x.Secrets) 
      .FirstOrDefault(x => x.Id = id); 

     return View(partner); 
    } 
} 

このエラーが発生しない別のビューでは、まったく同じことを行っています。これを引き起こす原因は何ですか?どのように進めますか?

+0

「パートナー」には、コレクションまたは複合オブジェクトであるプロパティが含まれていますか? –

+0

はい、あります。そのうちの2つは正確です。 'public virtual ICollection 'と 'public virtual ICollection ' – Detilium

+0

おそらく' .Include() 'をクエリに使ってロードする必要があります。 –

答えて

0

Entity Frameworkのエンティティオブジェクトは、シリアル化に使用しないでください。これらのオブジェクトを分散キャッシュに格納すると、同じ問題が発生します。

シリアル化に引き続きEntityオブジェクトを使用する場合は、遅延読み込みを無効にします。

context.Configuration.LazyLoadingEnabled = false; 
+0

を編集しました。基本的に、EFオブジェクトと同じデータを含むモデルを作成するだけですか? – Detilium

+0

別のモデルを作成すると機能します。遅延読み込みを避けることもできます。クエリの前に、遅延読み込みを無効にします。レイジーローディングが無効になっている場合、ビューにそのデータが必要でない限り、インクルードは必要ありません。 – vijayst

関連する問題