2012-07-12 13 views
6

Die canonical answer auf, wo Database.SetInitializer Anrufe ist in Global.asax für Web-Projekte. Ich suche nach einer anderen Option.Vermeidung von Schrotflintenchirurgie mit Database.SetInitializer

Wir verwenden Entity Framework 4.3.1 mit Code zuerst. Wir schreiben Webdienste und WinForms-Anwendungen und stellen in der Regel Datenzugriffscodes (z. B. DbContexts) in gemeinsam genutzten Bibliotheken bereit.

Derzeit suchen die Konstrukteure unserer DbContext Nachkommen wie folgt aus:

public PricingContext(string connectionString) 
    : base(connectionString) 
{ 
    Database.SetInitializer<PricingContext>(null); 
} 

95% der Zeit, das ist der richtige Standard. 5% der Zeit (einige Integrationstests, Greenfield-Entwicklung usw.) ist es nicht. Wenn wir diesen Code in die Initialisierung (oder Konfiguration) unserer Dienste und Anwendungen verschieben, enthält das Hinzufügen eines neuen DbContext zu einer Bibliothek Shotgun Surgery. Alle diese Projekte müssen aktualisiert werden, auch wenn die Bibliothek den Kontext nicht direkt verfügbar macht.

Optionale Argumente sind eine Möglichkeit:

public PricingContext(string connectionString, 
    IDatabaseInitializer<PricingContext> databaseInitializer = null) 
    : base(connectionString) 
{ 
    Database.SetInitializer<PricingContext>(databaseInitializer); 
} 

die Standardstrategie Aufschalten könnte das Bestehen der initializer durch mehrere Schichten umfassen, though.

Wir haben auch überlegt, einen reflektionsbasierten Initialisierer zu erstellen, der alle Kontexte auf eine bestimmte Strategie setzt.

Was ist die beste Praxis?

Antwort

6

Erstellen einer DBContextBootstrapper-Klasse, die Sie in Global.asax jedes Projekts instanziieren können; welches in seiner Implementierung Initialisierer für jeden Kontext setzt.

Auf diese Weise müssen Sie, wenn Sie einen neuen dbcontext hinzufügen, Änderungen nur im Bootstrapper vornehmen, nicht in jedem Projekt.

+0

Vielen Dank! Nachdem wir dies und viele Diskussionen versucht hatten, entschieden wir uns, die Initialisierer an den Stellen zu setzen, an denen DbContexte erstellt werden (oder wo ein DI/IoC-Container konfiguriert wird). An diesem Punkt wissen wir, was die Kontexte sind. Meine ursprüngliche Frage basierte also auf falschen Annahmen. – TrueWill

2

EF 4.3 (und neuer) enthält auch die Möglichkeit zu define initializer from configuration file, so dass Sie es nicht im Code überhaupt setzen müssen, aber Sie müssen immer noch mehrere Konfigurationen verwalten.

@ Hasan Ratschläge sieht aus wie die beste Lösung für Sie.

Verwandte Themen