/ / Fehler: DbContext wurde gelöscht - c #, entity-framework, linq, dbcontext, jsonresult

Fehler: DbContext wurde gelöscht - c #, entity-framework, linq, dbcontext, jsonresult

public JsonResult JTask(int id)
{
using (TestDb db = new TestDb())
{
var a = db.ToDos.Where(todo => todo.UserId == id);
return Json(a, JsonRequestBehavior.AllowGet);
}
}

Ich habe ein Problem mit der Rückkehr JsonResult Wenn ich diesen Code ausführen, erhalte ich den Fehler

Msgstr "Der Vorgang kann nicht abgeschlossen werden, da DbContext ist gewesen entsorgt. "

Ich habe versucht, hinzuzufügen .ToList() am Ende der Zeile 3, wie vorgeschlagen wurde, aber dann bekam ich den Fehler

"Beim Serialisieren eines Objekts vom Typ wurde ein Zirkelverweis erkannt System.Data.Entity.DynamicProxies. "

Antworten:

2 für die Antwort № 1

Es ist nicht sehr offensichtlich, aber das eingebaute Json Methode nur die Serialisierung nach JTask Methode wurde beendet. Zu diesem Zeitpunkt wurde natürlich der Kontext gelöscht, was zu dem ursprünglichen Fehler führt, den Sie beschreiben.

Wenn du eine hast ICollection<TodoItem> Eigentum in Ihrem Todo Klasse, jede von ihnen wird eine haben ToDo Diese Eigenschaft ist eine Referenz auf das übergeordnete Element. Und jeder davon ToDo Eigenschaften werden auch haben ICollection<TodoItem> Kinder, die einen Bezug auf die habenwieder Eltern, und so weiter und so fort. Dies kann möglicherweise zu einer Endlosschleife führen, und wenn der Serializer versucht, das Objekt zu serialisieren, gibt er einen Zirkelreferenzfehler auf.

Eine Möglichkeit, beide Probleme auf derZur gleichen Zeit werden Viewmodels verwendet. Ein Ansichtsmodell ist eine Zwischenklasse, die nur eine Teilmenge der Eigenschaften einer Modellklasse enthält. Der typische Ablauf besteht darin, dass die Modellklasse zuerst in ein Ansichtsmodell konvertiert wird. Dann würde das Ansichtsmodell als Json serialisiert:

var viewModels = new List<TodoViewModel>();

using (TestDb db = new TestDb())
{
var todoModels = db.ToDos.Where(todo => todo.UserId == id).ToList();

foreach (var model in todoModels)
{
var todoViewModel = new TodoViewModel
{
// Populate viewmodel properties here
Text = model.Text
};

viewModels.Add(todoViewModel);
}
}

return Json(viewModels, JsonRequestBehavior.AllowGet);

Ich habe einen Blogbeitrag über die Vorteile von Viewmodels geschrieben. Sie können es hier überprüfen, wenn Sie interessiert sind: Warum ViewModels verwenden?


1 für die Antwort № 2

Weil Linq zu der Zeit faul ist JSON versucht die Daten heraus zu bekommen a (und erst dann geht es tatsächlich an db) das db ist bereits entsorgt worden - beim Verlassen des using

public JsonResult JTask(int id)
{
using (TestDb db = new TestDb())
{
var a = db.ToDos.Where(todo => todo.UserId == id).ToList();
return Json(a, JsonRequestBehavior.AllowGet);
}
}

0 für die Antwort № 3
var a = db.ToDos.Where(todo => todo.UserId == id).ToList();