2017-04-05 14 views
0

私は次のエラーを取得していますは、私は何も配置されていないにもかかわらず、ObjectContextはインスタンスが破棄されているそうだ

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

しかし、このフレームワークがこのエラーを投げている理由はわかりません。ここにコードがあります。

var bookmark = type.ToLower() == "bookmark" 
    ? db.Bookmarks.First(u => u.BookmarkID == id) 
    : db.Users.First(u => u.UserID == id).Videos.FirstOrDefault(a => a.Recording)?.Bookmarks.OrderBy(b => b.Timestamp).FirstOrDefault(); 
if (bookmark != null) 
{ 
    var meta = bookmark.relBookmarkMetadatas.Select(a => new 
    { 
     Value = 
     FormatValue(a.Value, a.MetadataDefinition.MetadataType.ObjectType, a.MetadataDefinition.MetadataType.FormatString), 
     a.MetadataDefinition.MetadataClass.Class, 
     a.MetadataDefinition.Name, 
     a.MetadataDefinition.MetadataType.ObjectType, 
     a.MetadataDefinition.MetadataType.FormatString 
    }); 
    return Json(meta, JsonRequestBehavior.AllowGet); 
} 

なぜこのエラーが発生しますか?

エラーは、あなたがJson(..)方法にレイジー・ロードEntityFramework ICollectionを渡している

var meta = bookmark.relBookmarkMetadatas.Select(a => new 
+1

どのラインでエラーが表示されますか? – Zalomon

+0

Enitityフレームワークは、デフォルトでlazy-loading ..を使用します。具体的に要求するまで、関連するデータの読み込みを遅らせます。おそらく、 '.Include()'メソッドを使って熱心な読み込みを試してみてください。あなたがエラーを受け取っている行を知っているといいですね。 –

答えて

1

です。応答がシリアル化される時点で、EntityFrameworkコンテキストが破棄されます。あなたはそれを渡す前に、

は、あなたのICollection/IQueryable/IEnumerableの最後に.ToList()を追加します。

return Json(meta.ToList(), JsonRequestBehavior.AllowGet); 
+0

どうもありがとうございました。なぜなら何故私は.ToList()を必要としたのですか? – devzero

+0

@devzero問題はありません:)一般的に言えば、できるだけチェーンの遅れとして、通常は1つ必要です。それで、EFがデータベースに負荷をかけることができるものと、メモリ内でのみ行うことができるものを知ることは楽しいことです。また、 'db.People.Where(...)。ToList()'は 'db.People.ToList()。where(...).ToList()'とはまったく異なります! –

関連する問題