Gibt es eine Möglichkeit zum zurücksetzen eines DbContext ohne Entsorgung und reinstantiating es?
Ich vor kurzem umgestaltet werden, eine WPF-Anwendung, so dass es nicht mehr wird jeder Einsatz der DbContext in einem using
- Klausel (siehe diese Frage). Stattdessen meine app benutzt nur die gleichen DbContext singleton ganzen.
Dies funktioniert gut, außer für ein kleines problem. Ich habe eine routine erstellt die Datenbank von Grund auf und fügt einige Standard-Daten. Diese routine verwendet ADO.NET direkt (nicht die DbContext), so dass der DbContext ist nicht bewusst, dass die Datenbank ist jetzt komplett anders.
Gibt es eine Methode zum zurücksetzen der DbContext ohne Entsorgung es? Ich möchte vermeiden, entsorgen Sie, wenn möglich, denn dies würde die Pause mehrere Referenzen auf die original-singleton in der gesamten app.
Du musst angemeldet sein, um einen Kommentar abzugeben.
War ich nicht in der Lage zu kommen mit einer Methode zum zurücksetzen der globalen DbContext. Ich war in der Lage mein problem zu lösen, jedoch durch die Injektion eines
DbContextLocator
in jeder Klasse muss eine DbContext statt der übergabe der DbContext selbst.Mein Ziel war die Aufrechterhaltung einer globalen DbContext, aber lassen Sie es zurückgesetzt werden, Wann immer es nötig ist (z.B. nach einem Datenbank neu zu erstellen oder zu importieren).
Meine Lösung verwendet abstrakte Klasse und eine konkrete Klasse.
Basisklasse
Konkreten Klasse
Nutzung
Holen Sie sich die aktuellen DbContext:
Zurücksetzen der DbContext:
Bearbeiten
Basierend auf Shimmy ' s feedback, ich habe
DbContextLocatorBase
in eine generische. (Ich bin auch jetzt der UmsetzungIDisposable
.)Basisklasse
Konkreten Klasse (optional, da die Basis-Klasse ist nicht mehr Abstrakt)
DbContextLocator
eine generische Klasse, d.h.DbContextLocator<TContext> where TContext : DbContext
, dann müssen Sie nicht haben, um eine abgeleitete Klasse, oder Sie können die abgeleitete Klasse nur zu reduzieren Ausführlichkeit, ohne Sie zu deklarieren ist alles drin, siehe Beispiel hiernew()
in der where-Klausel, gibt es irgendeinen Grund zu bevorzugenActivator.CreateInstance<TContext>()
über einfachnew TContext()
?TContext
war erst zur Laufzeit. Ich dachte, ich könnte nur eine SchnittstelleIDbContextLocator
mit einemDbContext Current { get; }
Eigenschaft, aber dann ist die generische Klasse zurückDbContext
eher alsTContext
, die den Benutzer zwingen die generische Klasse zum ausführen einer cast. Die einzige Lösung, die ich denken kann, ist zurück zu gehen, um mit der konkreten Klasse zu definieren, Ihre eigenenCurrent
Eigenschaft führt, dass die Besetzung, aber das macht die generische Klasse fast nutzlos.Current
. Code:DbContext IDbContextLocator.Current { get { return _dbContext; } }
. Sorry für all die Kommentare 🙂 (ich bin immer noch neugierig Activator vs. new(), obwohl.)Activator.CreateInstance<T>
würden Sie sein besser von mitnew TContext()
,Activator.CreateInstance<T>
verwendet reflektion, zum Aufruf des ersten Konstruktors. Check dieser post für mehr.Halten ObjectContext offen für die gesamte Lebensdauer der Anwendung ist in der Regel eine schlechte Idee.
ObjectContext (oder DbContext in diesem Fall) ist für eine Einheit der Arbeit.
Sehen Entity Framework und Connection Pooling