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?
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