Tiefes Verständnis von Fehlern beim verzögerten Laden und Entsorgen in MVC .net
Ich habe versucht, eine ausführliche Antwort auf die folgende Frage zu schreiben:Warum funktioniert "Entsorgen" und nicht "Verwenden von (var db = new DataContext ())"?
Also habe ich mein Projekt eingerichtet, das Folgendes beinhaltet:
Abteilungen und Mitarbeiter, die das Entity-Framework verwenden
Meine Aktionsmethode war also:
public ActionResult Index()
{
IEnumerable<department> d;
using (var ctx = new ApplicationDbContext())
{
d = ctx.departments;
}
return View(d);
}
Es ist natürlich zu erwarten, dass dies zu dem allgemeinen Fehler führt:
The operation cannot be completed because the DbContext has been disposed
und als ich es lösen wollte, tat ich das folgende [um eifriges Laden eher als einfaches Laden zu erzwingen]:
public ActionResult Index()
{
IEnumerable<department> d;
using (var ctx = new ApplicationDbContext())
{
d = ctx.departments.toList();
}
return View(d);
}
Also habe ich versucht, die Dinge unter der Haube zu verstehen und habe mir den Rückgabetyp der View () -Methode angesehen. und ich erreichte die folgendenRichtig' Annahmen:
1- Das Modell [d] wird in der using-Anweisung faul geladen.
2- Wenn also das Modell [d] an die Ansicht zum Generieren der Seite gesendet wird, ist der DbContext bereits in der letzten geschweiften Klammer der using-Anweisung angeordnet.
3- Wir lösen diese Situation, indem wir das Modell [d] mit eifriger Lademethode an die Ansicht senden.
dann setzte ich meine Vermutungen fort, die sich als 'falsch' wie folgt:
4. Da die View () -Methode das ViewResult-Objekt zurückgibt, das auch ein ActionResult-Objekt ist, kann ich dieses Objekt in der using-Anweisung generieren und es dann an den Benutzer zurückgeben.
also habe ich folgendes gemacht:
public ActionResult Index()
{
ActionResult myView;
using (var ctx = new ApplicationDbContext())
{
IEnumerable<department> d = ctx.departments;
myView = View(d);
}
return myView;
}
Daher habe ich mir jetzt gesagt, dass das ViewResult-Objekt [myView] bereits erstellt und an den Benutzer zurückgegeben wird, und dass kein Fehler auftritt, wenn ich es ausführe.
Ich war jedoch überrascht, dass der gleiche Fehler auftrat:
The operation cannot be completed because the DbContext has been disposed
Ich war erstaunt, wie faul das Laden wirklich ist und lade erst im letzten Moment.
Also fuhr ich fortfalsch'Annahmen wie folgt:
5- Möglicherweise muss ich die View () - Methode erzwingen, um das Ergebnis in der using-Anweisung auszuwerten. Also habe ich die Methode angewendetExecuteResult(ControllerContext)
.
und jetzt dachte ich, ich kann die Action-Methode ohne Fehler ausführen, aber wieder trat der gleiche Fehler auf:
The operation cannot be completed because the DbContext has been disposed.
Meine Frage lautet nun also:
Wo im MVC-Framework erfolgt die Ausführung der Abfrage für verzögertes Laden?
oder lassen Sie mich meine Frage wie folgt umformulieren:
Warum?View(d)
Die Methode iteriert über das [d] -Objekt, wenn es sich nicht in der using-Anweisung befindet, und nicht, wenn sich die view (d) -Methode in der using-Anweisung befindet.
Ich muss nur verstehen, warum meine Annahmen falsch waren. Danke im Voraus