Verwalten der Lebensdauer von dbContext
Ich würde gerne Band-die Lebensdauer eines dbContext auf die Lebensdauer einer Sitzung, um - zum Beispiel - in der Lage sein zu Begehen oder Abbrechen der änderungen auf eine Gruppe von Mutationen auf die dbcontext-über mehrere Anfragen.
Gibt es andere (bessere?) Möglichkeiten, dies zu erreichen? Wenn Nein, was wäre ein geeigneter Mechanismus zu schaffen, und entsorgen Sie die Zusammenhänge? Ich denke über statische Hashtabellen mit Aufräumen am Ende der Sitzung, aber vielleicht mache ich Alles Falsch. Ich denke auch über die Idee, nur hält Sie sich auf jene Kontexte, die zu tun, die Arbeit auf mehrere Anfragen, und halten Sie den rest-pro-Aktion. Irgendwelche Ratschläge?
- Ein paar Dinge, Erstens, dass MVC nicht über ein Konzept von Sitzungen, die ein großer Teil von MVC, dass seine stateless, d.h. keine Zustand zwischen requests. Zweitens habe ich persönlich das Gefühl, dass es eine wirklich schlechte Idee zu halten, einen DBcontext öffnen, die lange jedenfalls, wie es progressivly und langsamer wird je mehr Objekte verfolgt. dies bedeutet, dass Ihre Benutzer-Erfahrung verschlechtern, je länger ein Benutzer auf der Website.
- Hallo, vielen Dank für das feedback. Könnten Sie empfehlen eine andere Möglichkeit, dies zu lösen? Auch ich glaube, dass Sitzungen immer noch eine wichtige Rolle spielen. Einkaufswagen, bleiben, angemeldet, etc. etc. etc. alles ist session-basiert - oder zumindest, ich denke, es ist.
- Wenn Sie mit einem IOC-container, können Sie die Lebensdauer der Rahmen zu pro web-Anfrage. So, wenn Sie den Kontext, in mehreren Orten in der gleichen Anfrage verwenden Sie das gleiche context-Instanz.
- normalerweise mit MVC beschäftigen wir uns mit den Dingen ein bisschen anders, zum Beispiel mit Auth verwenden wir eine cookie-Zustand zu halten, dies gibt die illusion einer persistenten login. Im Falle Ihrer DBcontext ich würde empfehlen, die übergabe der partial-Modell, um die Ansicht bis zu seinem Abschluss und zu speichern, die teilweise an die Datenbank. Wenn youre interessiert, warum EF-werden langsam, mit vielen überwachten Elementen, check out my post hier: blog.staticvoid.co.nz/2012/05/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie IoC(Inversion of Control) Container zum verwalten der Lebensdauer von DBContext wie StructureMap mit folgenden Schritten :
Installieren Sie nuget-Paket für MVC 4 :
http://nuget.org/packages/StructureMap.MVC4
Lesen quick start :
http://docs.structuremap.net/QuickStart.htm
Legen Sie den Umfang Ihres DBContext :
http://docs.structuremap.net/Scoping.htm
Außerdem können Sie die Kombination von Repository und Unit Of Work Pattern für commit oder Abbrechen der änderungen auf eine Gruppe von Mutationen auf die dbcontext-über mehrere Anfragen.
Diese Frage beantwortet wird Recht elegant in das folgende SO schreiben:
StructureMap CacheBy InstanceScope.HttpSession nicht funktioniert
Im wesentlichen, die Magie kommt aus dem folgenden code (angepasst für Ihre Frage und die neuere syntax für
StructureMap
):Dann - in Ihrem controller, erstellen Sie einfach eine Instanz des Objekts mithilfe:
Weil Ihr IoC (Inversion of Control) set-up über
StructureMap
so konfiguriert hat, dass die Instanzen begrenzt werden, umHttpSession
sollten Sie abrufen, gleichen Kontext jedes mal, wie lange die session ist die gleiche.Allerdings - Bedenken Sie, dass mit
DbContext
Objekte, insbesondere dies ist in der Regel eine sehr schlechte Idee - so mischen Sie ein state-tracking-Objekt mit einer zustandslosen Umgebung, und können leicht selbst in einen Zustand, wo eine schlechte Transaktion oder ein Objekt, das in einem ungeraden Zustand kann verhindern, dass Sie tun, werden keine weiteren Datenbank-Anrufe, bis Sie aktualisieren Sie Ihre Sitzung.DbContext
Objekte werden in der Regel entwickelt, um extrem leicht und Einweg. Es ist völlig ok, wenn Sie drop-out-of-scope und sterben im Grunde, sobald Sie fertig sind mit Ihnen.StructureMap
durch Einspritzen von allen Controllern (bevorzugt) und dann mit einem Konstruktor für die controller wie:public MyController(MyContext context) { }
- die auch eine lokale Kopie zu verwenden, mit den gleichen Einstellungen. Jedoch, um zu helfen, das Plakat umzusetzen, die ich gebraucht hätte um zu schreiben, eine ganze Reihe von blog-Artikeln und code-Beispielen, die schien unpassend für dieses forum. Daher die einfache Antwort, die vielleicht unvollkommen, aber praktikabel.Es ist nicht eine gute idia gehört zu geben DbContext live mit der Sitzung.
Wenn du mehr Anfrage geladen werden, die einen Teil der Daten, um den Kontext aus der DB, die Kontext noch mehr Dicke , das heißt, Gedächtnis Probleme,
Und Sie werden nicht aktualisiert Daten im Vergleich zu DbContet pro eine Anforderung im Kontext da ein anderer Benutzer (ein weiteres Sitzung) möglicherweise aktualisiert die Daten, die Sie bereits geladen haben, auf den Kontext.
Caching Entity Framework DbContexts pro Anfrage
Lesen und diese für Ihre Möglichkeiten ,
Asp.Net MVC und Sitzung
Typischerweise in diesem Szenario müssen Sie halten die Veränderungen in den temporary store(wie session oder cookie oder Datenbank). Wenn Sie brauchen, um Ergebnis speichern oder anzeigen neue Daten bekommen Sie die alten Daten und-änderungen und erstellen neues Objekt. Änderungen können gespeichert werden als neues Objekt oder einer Folge von Aktionen. Werden carfule, wenn änderungen anwenden, Daten-Konflikt kann auftreten. Natürlich verwenden Context\Anfrage
In der Theorie, die Sie speichern können, ein Kontext in der Sitzung Wörterbuch, das Sie zugreifen können, in jedem controller. Allerdings müssen Sie möglicherweise einige threading-problem, denn wenn Sie es speichern, Sie sind in einem anderen thread, als wenn Sie Sie abrufen. Wenn der Kontext nicht verwenden threadstatic varaibles dies funktionieren könnte (bin aber nicht sicher), sonst nicht. In jedem Fall ist das schlechtes design, ...nichts im web dies tun...warum willst du speichern Kontext? Sie können neu erstellen Sie es zu einem günstigen Preis im ths nachfolgende http-Anfrage. Wenn Sie brauchen, um track-änderungen von Eigenschaften gibt es andere Möglichkeiten mehr ausreichend, um die web.