it-swarm.com.de

ASP.NET MVC 4, Migrationen - Ausführen der Update-Datenbank auf einem Produktionsserver

Ich kann den Paket-Manager verwenden, um 'update-database -verbose' lokal auszuführen.

Wahrscheinlich eine dumme Frage, aber ich kann sie online nicht finden - sobald meine Website bereitgestellt ist - wie kann ich diese manuell auf dem Server ausführen?

Zweitens - welche anderen Strategien würden Sie für die Bereitstellung von Datenbankmigrationen in der Produktion empfehlen - und wie wären sie zu bevorzugen?

Vielen Dank

23
niico

Sie haben mehrere Möglichkeiten:

  • Sie können update-database -script verwenden, um die SQL-Befehle zum Aktualisieren der Datenbank auf dem Server zu generieren
  • Sie können die Datei migrate.exe executable verwenden, die sich im Paketordner auf /packages/EntityFramework5.0.0/tools/migrate.exe befindet. Ich habe es in der Vergangenheit mit dem Team City Build Server von Jet Brains erfolgreich verwendet, um die Migrationen mit meinen Implementierungsskripts einzurichten.
  • Wenn Sie IIS Web Deploy verwenden, können Sie den Server anweisen, die Migrationen nach der Veröffentlichung durchzuführen (siehe Abbildung unten)
  • Sie können automatische Migrationen einrichten, aber ich ziehe es vor, die Kontrolle darüber zu haben, wann etwas passiert :)

Update: Schauen Sie auch nach Sayed Ibrahims Blog , er arbeitet im MsBuild-Team bei Microsoft und hat einige großartige Einblicke in die Bereitstellung 

enter image description here

27
amhed

Ich weiß, dass die Frage bereits beantwortet ist, aber zur zukünftigen Bezugnahme:

Eine der Optionen besteht darin, etwas in den Konstruktor Ihrer DB-Kontextklasse aufzunehmen:

public MyDbContext()
    {
        System.Data.Entity.Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyDbContext, Configuration>());            
    }
9
Martin Falc

Für uns sind die Datenbankadministratoren die einzige Gruppe, die Zugriff auf die Produktionsumgebung (und die Produktionsumgebung) hat. Wir verwenden einfach den Befehl Update-Database -Script package console, um die für die Aktualisierung der Datenbank erforderliche SQL zu erhalten. Dies wird an sie weitergegeben, wo sie es validieren können usw.

Für manche vielleicht etwas zu simpel, aber es funktioniert.

HTH.

4
Sean Kenny

Eine einfache Lösung: Ausführen von Update-Database über Ihre lokale Package Manager Console, wobei ein Verbindungszeichenfolgeparameter mit der Produktionsverbindungszeichenfolge angegeben wird. Sie müssen auch den Namen des Verbindungsanbieters angeben (in diesem Beispielcode SqlServer):

Update-Database -ConnectionString <your real remote server connection string here> -ConnectionProviderName System.Data.SqlClient

Anstelle der Verbindungszeichenfolge können Sie einen Verbindungszeichenfolgennamen verwenden, der in Ihrer app.config-Datei connectionStrings enthalten ist:

Update-Database -ConnectionStringName <your connection string name here>

Sie müssen über Berechtigungen verfügen, um von Ihrem lokalen Computer auf diesen Server zuzugreifen. Wenn Sie beispielsweise von einem SQL Server Management Studio aus eine Verbindung zum Server herstellen können, können Sie dies verwenden.

Beachten Sie, dass dieser Ansatz für ein reales Produktionssystem nicht empfohlen wird. Sie sollten etwa das verwenden, was in der akzeptierten Antwort erläutert wird. Es kann Ihnen jedoch bei schnellen Hacks in Remote-Entwicklungsservern, Testumgebungen usw. helfen.

2
Diana

Ich persönlich mag es, automatische Migrationen einzurichten, die jedes Mal ausgeführt werden, wenn die Startmethode der Anwendung aufgerufen wird. Auf diese Weise müssen Sie bei jeder Bereitstellung die Migrationen ausführen und die Anwendung automatisch aktualisieren.

Schauen Sie sich diesen Beitrag von AppHarbor an. http://blog.appharbor.com/2012/04/24/automatic-migrations-with-entity-framework-4-3

Grundsätzlich möchten Sie die automatischen Migrationen aktivieren und dann DatabaseInitializer aus Ihrem Code aufrufen, entweder über die OnModelCreating-Methode oder über Ihre Global.asax.

1

um jedem die einfache Antwort zu geben.

Dies ist die "Update-Database" In Ihrem Migrationsordner Configuration.cs:

    internal sealed class Configuration : DbMigrationsConfiguration<projectname.Models.dbContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = true;
        AutomaticMigrationDataLossAllowed = true; // Update-Data -Force (deletes columns etc)
    }

Fügen Sie Ihrer Datei "Global.asax.cs" Folgendes hinzu: "Migrationen aktivieren" auf einem Remote-Server

        protected void Application_Start()
    {
        ....
        System.Data.Entity.Database.SetInitializer(new MigrateDatabaseToLatestVersion<dbContext, Migrations.Configuration>());
0
Worthy7

Sie können die Skripts mithilfe von EF-Befehlen (update-database -script) abrufen oder das Skript manuell schreiben. Dies ist nicht das Wichtigste beim Aktualisieren der Datenbank in der Produktionsumgebung. Für mich ist es das Wichtigste, sicher zu gehen, dass alle Skripts korrekt ausgeführt wurden und die Datensätze erwartungsgemäß betroffen sind. Meiner Meinung nach sollte eine Vorproduktionsumgebung vorhanden sein, und die Datenbank sollte eine Kopie der Produktionsumgebung sein. Auf diese Weise können Sie die Skripts ausführen und die Anwendung in einer ähnlichen Umgebung bereitstellen und feststellen, ob Probleme vorliegen. Manchmal werden die Skripts in der DEV-Umgebung korrekt ausgeführt, sie schlagen jedoch in der Produktionsumgebung fehl. Um Kopfschmerzen zu vermeiden, sollten Sie die Produktionsumgebung in einer Vorproduktionsumgebung simulieren. Wenn es sich bei dem Team um mehr als einen Entwickler handelt, ziehe ich es vor, die Skripts in Strukturskripts und Datenskripts zu kategorisieren. Struktur-Skripts ändern die Struktur der Datenbank (fügen Sie eine Tabelle hinzu, fügen Sie einer Tabelle eine Spalte hinzu usw.), und Datenskripts fügen Datensätze ein. Außerdem sollte jedes Skript seine Abhängigkeiten angeben, damit sie nicht in der falschen Reihenfolge ausgeführt werden können. Ein Datenskript, das Zeilen in Tabelle A einfügt, kann erst ausgeführt werden, wenn Tabelle A erstellt wurde. Das mache ich: - Definiere eine Tabelle zum Registrieren der ausgeführten Skripte. Beispiel: ExecutedScriptsHistory .- Jedes Skript hat eine Nummer und einen Namen .- Nachdem ein Skript ausgeführt wurde, wird eine neue Zeile in die Tabelle ExecutedScriptsHistory .- eingefügt. Bevor ein Skript ausgeführt wird, prüft es dessen Abhängigkeiten. Dazu wird geprüft, ob die Skripts ausgeführt wurden (in der Tabelle ExecutedScriptsHistory vorhanden).

Nachdem Sie die Skripts ausgeführt haben, können Sie überprüfen, ob alle Skripts ausgeführt wurden, indem Sie auf "ExecutedScriptsHistory" überprüfen. Diese Strategie ähnelt der von Microsoft in EF Migration gewählten Strategie, Sie haben jedoch die volle Kontrolle darüber.