2015-07-20 9 views
5

Ich habe einen Kontext in meiner Datenbank, die 3 Kind-Datenbankinstanzen verweist. Ich injiziere den korrekten DB-Verbindungsstring über den Contextor des Kontextes.EF Mehrere Datenbanken mit einem Kontext

Jedoch habe ich Schwierigkeiten diese immer mit automatischer Migration zu arbeiten. Das Problem ist, dass automatische Migrationen einen parameterlosen Konstruktor erwarten, den ich nicht bereitstellen kann, und IDbContextFactory erlaubt mir nur, eine Verbindungszeichenfolge zurückzugeben.

Gibt es eine Weise, die ich die Migrationsskripte erhalten können gegen mehrere Datenbanken zu laufen oder brauche ich 3 separate Kontexte zu schaffen?

+0

Nur klar zu sein, sind Sie einen EF Zusammenhang mit zu 3 verschiedenen Instanzen einer Datenbank mit dem gleichen Schema und Sie verbinden Möchten Sie, dass der Kontext den Aktualisierungspfad für alle 3 Instanzen beibehalten kann? – Tr1stan

+0

Ja genau! Wenn es versucht, die automatischen Migrationen zu tun, scheint mir nur eine bestimmte Verbindungszeichenfolge spezifisch zu ermöglichen. – heymega

+0

Wenn was @ Tr1stan ist richtig, dann ist, wie ich damit umgehen ist 'public CustomContext() : base (DbConnections.GetCurrentConnectionString) { } 'Was dies tut, ist Ihr Kontext immer noch einen parameterlosen Konstruktor, aber die Connectionstring vorher was auch immer Kriterien wurden Setup wird davon abhängen, (für mich wählt der Benutzer dev, test, prod) – SpaceSteak

Antwort

5

Jede Instanz des Kontextes hat eine Datenbankverbindung.

Unter der Annahme, dass jedes Kind Datenbank wille das gleiche Code-first-Modell hat, können Sie eine Instanz der gleichen Kontextklasse für jede Datenbank starten.

Rufen Sie einfach DbContext.Initialize (true), um die Datenbank zu migrieren, dann die Verbindung schließen.

var context1 = new MigratorContext(connectionString1); 
context1.Initilialize(true); 
var context2 = new MigratorContext(connectionString2); 
context2.Initilialize(true); 
var context3 = new MigratorContext(connectionString3); 
context3.Initilialize(true); 

einen Konstruktor hinzu MigratorContext die Verbindungszeichenfolge unter:

public MigratorContext(string connString) 
    : base(connString) 
{ 
    var migrationConfiguration = new MigrationConf(); 

    Database.SetInitializer<MigratorContext>(
     new MigrateDatabaseToLatestVersion< 
      MigratorContext, MigrationConf>(true, migrationConfiguration)); 
} 

public sealed class MigrationConf : DbMigrationsConfiguration<MigratorContext> 
{ 
    public MigrationConf() 
     : base() 
    { 
     AutomaticMigrationsEnabled = true; 
     AutomaticMigrationDataLossAllowed = true; 
    } 
} 
+0

Hmm, das könnte funktionieren - Wo würdest du die 3 dbcontexts in einer MVC-Anwendung initialisieren? – heymega

+0

Es kann beim Start initialisiert werden oder wenn Ihre Anwendung Persistenz benötigt. Diese Kontexte werden vom Controller verwendet, der Kontext hängt jedoch vom Modell ab, sodass es sich um eine Persistenzschicht zwischen Ihrer Controller-Schicht und Ihrer Modellschicht handeln könnte. – abreneliere

+0

Entschuldigung für die späte Antwort - ich habe es geschafft, das funktioniert so vielen Dank für Ihre Hilfe. Der Trick besteht darin, MigrateDatabaseToLatestVersion useSuppliedContext auf true zu setzen, andernfalls wird ein leerer Konstruktor erwartet. – heymega

Verwandte Themen