So benennen Sie die Datenbank explizit, wenn Sie Entity Framework Migrations 4.3 verwenden

StackOverflow https://stackoverflow.com/questions/9327409

  •  27-10-2019
  •  | 
  •  

Frage

Ich habe vor Kurzem mit der Verwendung von Entity Framework-Migrationen begonnen und festgestellt, dass der Datenbankname bei der Ausführung von nicht angezeigt wird Update-Database Befehl.

Mein Verbindungsstring ist:

<connectionStrings>
<add name="DataContext" connectionString="Server=.\SQLEXPRESS;Initial Catalog=TestDB;Trusted_Connection=Yes;" providerName="System.Data.SqlClient" />
</connectionStrings>

Das allererste Mal, dass ich laufe Datenbank auf den neusten Stand bringen Meine Datenbank wird mit dem richtigen Namen erstellt TestDB.Sobald ich jedoch eine Änderung an einer meiner Entitäten vornehme, wird sie für mich nicht mehr aktualisiert, es sei denn, ich füge einen Startprojektnamen hinzu (ich verwende eine Lösung mit mehreren Projekten):

Update-Database -StartUpProjectName "TestDB.Data"

Dadurch wird dann eine weitere neue Datenbank erstellt, die bei Migrationen immer weiterhin verwendet wird.Es macht mir nichts aus, das einfügen zu müssen StartUpProjectName Befehl, aber gibt es eine Möglichkeit, den Standardnamen für die dadurch erstellte Datenbank zu überschreiben?Die Datenbank wird immer als erstellt

TestDB.Data.DataContext

Gibt es eine Möglichkeit sicherzustellen, dass die beim Übergeben des StartUpProject-Namens erstellte Datenbank nur aufgerufen wird? TestDB Oder ist dies eine Einschränkung bei der Verwendung der StartUpProjectName-Einstellung?

Als Anmerkung: Ich denke, der Grund, warum ich den StartUpProjectName angeben muss, ist, dass ich ein mehrschichtiges Projekt-Setup habe.Die Migrationskonfigurationsdatei befindet sich in meinem „Daten“-Projekt, die Entitäten/Modelle befinden sich in meinem „Domänen“-Projekt usw.Ich habe derzeit auch keine Initialisierungsoptionen in meiner Global.asax.cs-Datei, wie ich sie zuvor bei Code First EF 4.2 verwendet hätte.In meinem Projekt habe ich also nur einen DataContext in meinem Datenprojekt und auch die Migrationskonfiguration in diesem Projekt.

BEARBEITEN:

Da ich diese Frage ursprünglich gestellt habe, bin ich auf die „richtige“ Art gestoßen, eine Datenbank in einer Multiprojektlösung zu benennen.Die folgende Antwort funktioniert zwar, bedeutet aber, dass Sie Ihre web.config in einem anderen Bereich duplizieren, was keine ideale Lösung ist.Stattdessen können Sie den Namen einfach in Ihren DbContext einfügen, indem Sie so etwas tun (DataContext ist nur der Name, den ich in meinem Projekt verwendet habe):

public class DataContext : DbContext
{
    public DataContext() : base("DatabaseNameHere")
    { }

    public DbSet<Table1> Table1 { get; set; }
    public DbSet<Table2> Table2 { get; set; }

    public virtual void Commit()
    {
        base.SaveChanges();
    }
}

Danke,

Reich

War es hilfreich?

Lösung

Bei update-database Sie sollten das Projekt angeben, das die Migrationen enthält. Stellen Sie sicher, dass Sie eine haben app.config Datei in diesem Projekt, das die richtige Verbindungszeichenfolge enthält.

Bei der Aufteilung einer Anwendung über mehrere Projekte ist die Verbindungszeichenfolge, die beim Ausführen der App verwendet wird, der von Projekten gestartet. Bei der Migration ist die verwendete Verbindungszeichenfolge die des Projekts, das die Migrationen enthält.

Als ich ein ähnliches Setup machte, musste ich die Verbindungszeichenfolge an zwei Stellen hinzufügen. Ein bisschen unangenehm, aber es funktioniert.

Andere Tipps

Sie können es vermeiden, es in app.config zu verwalten, indem Sie es als Parameter anbieten:

Update-Database -Verbose 
 -ConnectionString "CONNECTIONSTRING" 
 -ConnectionProviderName "System.Data.SqlClient"
 -StartupProjectName WEBSITE_PROJECT -ProjectName MIGRATION_PROJECT

Easy-Piezy, wenn Sie gerne endlos tippen.

Sie können Ihre Verbindungszeichenfolge in Ihrem Website -Projekt und in einem anderen Projekt in der web.config in Ihrem Website -Projekt und in den DBContext- und Migrationsdateien gespeichert lassen und weiterhin dieselbe Verbindungszeichenfolge teilen. Sie müssen jedoch sicherstellen, dass sowie das Standardprojekt für die Paket -Manager -Konsole Sie als Standardprojekt für die Paket -Manager -Konsole festlegen und das Datenprojekt (oder das Projekt enthält, auch das Projekt enthält den DBContext usw.). Sie müssen auch sicherstellen, dass Ihre Website auf das Standard -Startprojekt eingestellt ist !!!

Ich kann dies nirgendwo dokumentiert sehen, aber eine hektische 24 Stunden, in der ich nicht herausfinden konnte, warum meine Migrationen, wo plötzlich auf eine Sqlexpress -DB angewendet wird, zu dieser Schlussfolgerung geführt hat.

Ich habe es mit dem neuesten EF5 von Nuget versucht.

Jedoch Update-Database liest das nicht App.config aus dem Projekt, das die Migrationen enthält (genau wie die Antwort vor einem Jahr), aber es wird nur gelesen *.config aus Projekt starten.Es ist großartig, aber ich entdecke, wie Add-Migration Und Update-Database Finden Sie hier eine passende Verbindungszeichenfolge:

  1. Es wird zuerst versucht, die Verbindungszeichenfolge „DefaultConnection“ abzurufen
  2. Anschließend wird versucht, den Namen der Verbindungszeichenfolge basierend auf dem Namen der Kontextklasse abzurufen.Z.B.ich habe MyContext Klasse abgeleitet von DbContext Daher kann ich den Namen der Verbindungszeichenfolge „MyContext“ verwenden.Nützlich, wenn ich mehrere Datenbankverbindungen habe.
  3. Wenn beide oben genannten Verbindungszeichenfolgennamen nicht gefunden werden, schlägt der Vorgang fehl und es wird keine „DefaultConnection“-Verbindungszeichenfolge angezeigt, es sei denn, Sie geben die an -ConnectionStringName Parameter.Sehen get-help Update-Database , um die Hilfeseite in der Package Manager-Konsole anzuzeigen.

Es gibt keinen Wiederholungs- oder Fallback-Versuch. Wenn „DefaultConnection“ also eine falsche Verbindungszeichenfolge enthält, wird lediglich ein Fehler angezeigt.

Wenn in den Verbindungszeichenfolgen sowohl DefaultConnection als auch Kontextname vorhanden sind, hat DefaultConnection Vorrang.

Ich würde es vorziehen, wenn Nr. 2 der erste Versuch wäre, da der Name spezifischer ist, aber die oben genannten Schritte werden von EF5-Migrationen ausgeführt, wenn versucht wird, eine Verbindung zur Datenbank herzustellen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top