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 № 1Es 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();