Gibt es eine Möglichkeit, einen DbContext zurückzusetzen, ohne ihn zu löschen und neu zu installieren?

9

Ich habe kürzlich eine WPF-App so überarbeitet, dass sie nicht mehr jede Verwendung des DbContext in einer using -Klausel umschließt (siehe diese Frage ). Stattdessen verwendet meine App nur den gleichen DbContext Singleton.

Das funktioniert gut, bis auf ein kleines Problem. Ich habe eine Routine, die die Datenbank von Grund auf neu erstellt und einige Standarddaten einfügt. Diese Routine verwendet ADO.NET direkt (nicht den DbContext), so dass der DbContext nicht weiß, dass die Datenbank jetzt völlig anders ist.

Gibt es eine Methode, um den DbContext zurückzusetzen, ohne ihn zu entsorgen? Ich würde es gerne vermeiden, wenn möglich, zu entsorgen, weil dadurch mehrere Referenzen auf den ursprünglichen Singleton in der gesamten App zerstört würden.

    
devuxer 13.04.2011, 01:54
quelle

2 Antworten

7

Ich konnte keine Methode finden, um den globalen DbContext zurückzusetzen. Ich konnte mein Problem jedoch lösen, indem ich eine DbContextLocator in jede Klasse einfüge, die einen DbContext benötigt, anstatt den DbContext selbst zu übergeben.

Mein Ziel war es, einen globalen DbContext beizubehalten, aber zu erlauben, dass er bei Bedarf zurückgesetzt wird (zum Beispiel nach einem Datenbankaufbau oder -import).

Meine Lösung verwendet eine abstrakte Basisklasse und eine konkrete Klasse.

Basisklasse

%Vor%

Betonklasse

%Vor%

Verwendung

Erhalte den aktuellen DbContext:

%Vor%

Setzen Sie den DbContext zurück:

%Vor%

Bearbeiten

Basierend auf Shimmys Feedback, habe ich DbContextLocatorBase zu einem Generic gemacht. (Ich implementiere jetzt auch IDisposable .)

Basisklasse

%Vor%

Konkrete Klasse (optional, da die Basisklasse nicht mehr abstrakt ist)

%Vor%     
devuxer 13.04.2011, 20:54
quelle
4

Es ist im Allgemeinen eine schlechte Idee, einen ObjectContext für die Lebensdauer der Anwendung geöffnet zu lassen.

ObjectContext (oder DbContext in diesem Fall) ist für eine Arbeitseinheit.

Siehe Entity Framework und Connection Pooling

    
Ian Mercer 13.04.2011 07:04
quelle