Frage

Ich bin ein total Neuling in Entity Framework und ASP.Net MVC, gelernt zu haben, vor allem aus Tutorials, ohne ein tiefes Verständnis der entweder mit. (Ich habe zu tun Erfahrung auf .Net 2.0, ADO.Net und WebForms)

kommt Mein aktueller Zweifel von der Art, wie ich meine Entitäten Objekte bin Instancing.

Im Grunde mache ich dies in meinem Controller:

public class PostsController : Controller {

    private NorthWindEntities db = new NorthWindEntities();

    public ActionResult Index() {
            // Use the db object here, never explicitly Close/Dispose it
    }
}

Ich bin es so zu tun, weil ich es in einigem MSDN-Blog gefunden, die mir maßgebende genug schien, dass ich davon ausgegangen, das ein richtiger Weg war.
Aber ich fühle mich ziemlich un-leicht darüber. Obwohl es mir eine Menge Code speichert, bin ich zu tun verwendet:

using (NorthWindEntities db = new NorthWindEntities() {
}

In jedem einzelnen Verfahren, die eine Verbindung benötigt, und wenn das Verfahren andere aufruft, die es brauchen, wird es db als Parameter an sie übergeben. Dies ist, wie ich tat alles, was mit meinen Verbindungsobjekten vor Linq-to-SQL existierte.

Das andere, was mich unruhig macht, ist, dass NorthwindEntities IDisposable implementiert, das von der Konvention bedeutet, sollte ich es Methode Dispose () anrufen, und ich bin es nicht.

Was denken Sie darüber?
Ist es richtig, zu Beispiel der Entitäten Objekt wie ich tue? Sollte es kümmern sich um ihre Verbindungen durch Öffnen und Schließen sie für jede Abfrage?
Oder sollte ich es explizit mit einem () verwenden Klausel werden Entsorgung?

Danke!

War es hilfreich?

Lösung

Controller selbst implementiert IDisposable. So können Sie entsorgen außer Kraft setzen und entsorgen Sie etwas (wie einem Objektkontext), die Sie initialisieren, wenn der Controller instanziiert wird.

Die Steuerung lebt nur so lange, als eine einzige Anfrage. ein, um innerhalb einer Aktion und mit einem Objektkontext für die gesamte Steuerung So hat genau die gleiche Anzahl von Kontexten. 1

Der große Unterschied zwischen diesen beiden Methoden ist, dass die Aktion abgeschlossen hat, bevor die Ansicht verdient gemacht hat. Also, wenn Sie Ihre Object in einer using-Anweisung innerhalb der Aktion erstellen, wird sich die Object angeordnet worden, bevor der Blick verdient gemacht hat. So haben Sie besser etwas aus dem Zusammenhang zu lesen, die Sie benötigen, bevor die Aktion abgeschlossen ist. Wenn das Modell in die Ansicht passieren einige faul Liste wie ein IQueryable ist, haben Sie den Kontext angeordnet, bevor die Ansicht gerendert wird, eine Ausnahme zu verursachen, wenn die Ansicht die IQueryable aufzuzählen versucht.

Im Gegensatz dazu, wenn Sie die Object initialisieren, wenn die Controller initialisiert (oder faul Initialisierung Code schreiben, so dass es initialisiert werden, wenn die Aktion ausgeführt wird) und entsorgen Sie die Object im Controller.Dispose, dann wird der Zusammenhang noch sein um, wenn die Ansicht gerendert. In diesem Fall ist es sicher eine IQueryable zur Ansicht zu übergeben. Der Regler wird in Kürze entsorgt werden, nachdem die Ansicht gerendert wird.

Schließlich würde ich nachlässig, wenn ich nicht geklappt habe darauf, dass es wahrscheinlich eine schlechte Idee des Controller an allen Entity Framework bewusst sein, haben. Schauen Sie in eine separate Baugruppe für Ihr Modell verwenden und das Repository-Muster das Controller Gespräch mit dem Modell zu haben. Eine Google-Suche wird ziemlich viel auf diese wieder auftauchen.

Andere Tipps

Sie machen einen guten Punkt hier. Wie lange leben sollten die Object? Alle Muster und Praktiken Bücher (wie Dino Esposito Microsoft-NET-Architecting-Anwendungen ) Ihnen sagen, dass ein Datacontext nicht mehr lange leben müssen, noch sollte sie im Cache gespeichert werden.

Ich frage mich, warum nicht mit, in Ihrem Fall eine Controllerklasse (ich bin die MVC Implementierung nicht bewusst, so mit mir tragen), wo die Object für alle Controller einmal eingeleitet wird. Vor allem denken über die Identity Map Pattern , dass bereits von Entity Framework implementiert wird. Auch wenn Sie einen anderen Controller als Posts anrufen müssen, wäre es immer noch mit dem gleichen Kontext arbeiten und auch die Leistung verbessern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top