EntityFramework Code-First benutzerdefinierte Verbindungszeichenfolge und Migrationen
Wenn ich ein Rahmen mit einem Standard-Verbindungszeichenfolge (wie Lesen aus der app.config
) die Datenbank wird erstellt und die Migrationen der Arbeit - im Grunde alles in Ordnung ist. In der Erwägung, dass, wenn die Verbindungszeichenfolge erstellt programmgesteuert (mit SqlConnectionStringBuilder
):
- Datenbank nicht erstellt, wenn die Datenbank nicht vorhanden ist (Szenario
A
); CreateDbIfNotExists()
schafft die neuesten version der Datenbank-Modell, aber die migration Mechanismen sind nicht aufgerufen wird (SzenarioB
).
In A
eine Ausnahme wird geworfen wenn ich wollen Zugriff auf die Datenbank, wie Sie - offensichtlich - es ist nicht da. In B
Datenbank ist richtig erstellt, migration Mechanismen sind nicht genannt, wie es der Fall in der standard-Verbindungszeichenfolge.
app.config:
"Data Source=localhost\\SQLEXPRESS;Initial Catalog=Db13;User ID=xxx;Password=xxx
"
builder:
sqlBuilder.DataSource = x.DbHost;
sqlBuilder.InitialCatalog = x.DbName;
sqlBuilder.UserID = x.DbUser;
sqlBuilder.Password = x.DbPassword;
Initialisierer:
Database.SetInitializer(
new MigrateDatabaseToLatestVersion<
MyContext,
Migrations.Configuration
>()
);
Specs:
Entity Framework: 5.0, DB: SQL Server Express 2008
InformationsquelleAutor der Frage Red XIII | 2013-03-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Ihr die migration funktioniert nicht richtig, versuchen Sie
Database.Initialize(true)
im DbContext-ctor.Ich habe ähnliches problem mit Migrationen. Und in meiner Lösung habe ich immer festlegen von Datenbank-Initialisierung in ctor, wie unten
In benutzerdefinierte Initialisierung implementieren Sie
InitalizeDatabase(CustomContex context)
Methode, zB.AKTUALISIERT
InformationsquelleAutor der Antwort rraszewski
Er ist eine Lösung, mit KEINE Connection strings in der app.config.
Verwendet automatische Migrationen und 2 Datenbanken mit dem gleichen Kontext.
Die Reale Laufzeit geliefert-Verbindung. Ansatz.
APP.CONFIG (Mit EF 6)
Ich schrieb den code so klein wie möglich für die Demo:
InformationsquelleAutor der Antwort phil soady
Ich in der Lage, wechseln zwischen den verbindungen mit der folgenden Technik
1) Haben Sie mehrere connection-string als Namen definiert in der app.config.
2) ein Konstruktor, in dem Kontext, der nimmt den Namen der Verbindungszeichenfolge
3) die Create-Methode für den Kontext - und machen es in der Lage, erhalten den Namen der Verbindung ein ( mit ein bisschen trick )
4) Meine migration-Konfiguration ....
5) eine Funktion zum erstellen von Rahmen.
InformationsquelleAutor der Antwort Kirsten Greed
Ich habe kommen zu ähnlichen Schlussfolgerungen.
Wir hatten eine längere Diskussion auf, dass gestern. Werfen Sie einen Blick auf es.
Wird aufgerufen, wenn die Verbindung über DbContext-ctor - es ist, wo Probleme auftreten (vereinfacht). Als
DbMigrator
tatsächlich ruft die 'empty' - Konstruktor - so erhalten Sie einen mix der Dinge. Ich hatte einige sehr merkwürdige Effekte. Mein Fazit war, dass die normale InitialisierungCreateDb...
funktioniert - aber Migrationen nicht (und auch scheitern, Fehler auslösen, in einigen Fällen).InformationsquelleAutor der Antwort NSGaga
Für Migrationen können Sie entweder (1) nutzen
MigrateDatabaseToLatestVersion
die kick-in automatisch, wenn Sie starten Sie mit einer der Personen in Ihrem Kontext oder (2) verwendenDbMigrator
explizit sagen, EF, kick-off der migration. Der Vorteil von (2) ist, dass Sie nicht haben, um führen Sie einen dummy-Betrieb (wieAddJunk
@philsoady Beispiel), und man könnte sogarMigratorScriptingDecorator
wenn Sie wollte, extrahieren Sie die migration zu SQL (siehe Beispiel 2 im code)Den trick mit (2) scheint zu sein, sicherzustellen, dass die gleiche Verbindungszeichenfolge verwendet wird konsequent von Ihrem
DbMigrationsConfiguration
undDbContext
Klassen. Beachten Sie, dass mehrere Kontexten instanziiert werden im Laufe desDbMigration.Update
- alle rufen Sie das Kontext-Standard-Konstruktor (so watch out, wenn Sie mehr als einen Konstruktor). Sie haben auch 2 Optionen hier können Sie einconnection string name
in der app.config (aber dann kann man nicht programmatisch definieren Sie den connection-string) oder build\fest\load etc... eine kompletteconnection string
. Siehe die Kommentare im code unten.Getestet EF 6.0.1 & 6.0.2
InformationsquelleAutor der Antwort Ilan
Schauen Sie unter diesem link:
Es gibt Ihnen mehr Freiheit zu aktivieren, die Migrationen sich für jede Datenbank.
Ich löste dies durch eine statische Verbindungszeichenfolge zu einer bestimmten Datenbank, innerhalb der Standard-Konstruktor.
Sagen wir mal ich habe mehrere Datenbanken, die alle basieren auf dem gleichen schema: myCatalog1, myCatalog2 etc.
Ich benutze nur die ersten Datenbank-connection-string in den Konstruktor so:
Dieser Konstruktor wird verwendet, nur für die
Add-Migration
Befehl zu arbeiten, und erstellen Sie die Migrationen.Beachten Sie, dass es gibt keine Nebenwirkungen für den rest der Datenbanken, und wenn Sie benötigen einen anderen Konstruktor für die Initialisierung des Kontextes (für andere Zwecke mit Ausnahme für Migrationen), wird es funktionieren.
Nachdem ich das
Add-Migration
wie diese:Kann ich rufen Sie den nächsten code ( entnommen aus dem link am Anfang ), um die update-Migrationen auf jeden einer meiner Datenbankendie basieren auf dem gleichen schema wie myCatalog1:
InformationsquelleAutor der Antwort ilans
Wollte ich automatisch migrieren, wenn die Ausführung im DEBUG zu machen es einfach für die devs (die Produktion installer wird die Migrationen normal) aber hatte das gleiche problem, ein code-angegeben connection-string wird ignoriert, wenn die Migration.
Mein Ansatz war, um daraus die Migration von Kontexten aus diesem generic die Griffe "speichern" Sie die Verbindungszeichenfolge:
ReSharper Warnung ist, da statische Felder in einer generischen Klasse sind nur statische pro konkretem Typ in unserem Fall ist genauwas wir wollen.
Zusammenhänge sind definiert als:
welche Regel verwendet werden kann.
InformationsquelleAutor der Antwort PeteB