21

Ich kann den Paketmanager verwenden, um "update-database -verbose" lokal auszuführen.ASP.NET MVC 4, Migrationen - So führen Sie 'update-database' auf einem Produktionsserver aus

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

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

Dank

+0

Dies deckt nicht die manuelle Ausführung von 'update-database' ab - wie in VS. ie - Es gibt keine Paket-Manager-Konsole auf dem Server - also verwenden Sie einfach einen Befehl in der PowerShell oder der Befehlszeile? Wenn ja, konnte ich das nirgendwo finden. Ich würde gerne wissen, wie Sie das manuell ausführen - anstatt sich auf automatische Migrationen in der App zu verlassen. – niico

+0

Warum würde ich gerne wissen, wie man das manuell ausführt – niico

Antwort

25

Sie haben ein paar Optionen:

  • Sie update-database -script verwenden könnten die SQL-Befehle zum Aktualisieren der Datenbank auf dem Server
  • Sie die migrate.exe ausführbare Datei verwenden könnten zu generieren, die auf in dem Paket-Ordner befindet /packages/EntityFramework5.0.0/tools/migrate.exe. Ich habe es in der Vergangenheit erfolgreich mit Team City Server von Jet Brains verwendet, um die Migrationen mit meinen Bereitstellungsskripten einzurichten.
  • Wenn Sie IIS Web Deploy verwenden können Sie den Server anweisen, die Wanderungen nach veröffentlichen (siehe Bild unten)
  • Sie könnten Setup automatische Migrationen durchführen, aber ich ziehe es unter Kontrolle zu sein, wenn Dinge passieren :)

Update: auch Besuche Sayed Ibrahim's blog arbeitet er auf dem MsBuild-Team bei Microsoft und hat einige großartige Einblicke in die Einsätze

enter image description here

+0

Um die Kontrolle zu haben, verwende ich immer diese "Sie könnten update-database -script verwenden, um die SQL-Befehle zum Aktualisieren der Datenbank auf dem Server zu generieren" (obwohl ich bevorzuge überhaupt keine automatischen Migrationen zu verwenden, aber das ist ein anderes Thema) – Michel

3

Für uns sind die DBAs die einzige Gruppe Zugriff auf die Produktion (und Vorproduktion) Umgebungen zu haben. Wir verwenden einfach den Paketkonsolenbefehl Update-Database -Script, um die zur Aktualisierung der Datenbank erforderliche SQL zu erhalten. Das wird ihnen ausgehändigt, wo sie es validieren können usw.

Vielleicht ein wenig zu einfach für einige, aber es funktioniert.

HTH.

1

Ich persönlich möchte automatische Migrationen einrichten, die jedes Mal ausgeführt werden, wenn die Startmethode der Anwendung aufgerufen wird. Auf diese Weise können Sie bei jeder Implementierung, die Sie durchführen, die Migrationen ausführen und die Anwendung automatisch aktualisieren.

Überprüfen Sie diesen Beitrag von AppHarbor. http://blog.appharbor.com/2012/04/24/automatic-migrations-with-entity-framework-4-3

Das Wesentliche besteht darin, dass Sie automatische Migrationen aktivieren und dann den DatabaseInitializer aus Ihrem Code entweder von der OnModelCreating-Methode oder von Ihrem Global.asax aufrufen möchten.

0

Sie können die Skripts mit EF-Befehlen (update-database -script) abrufen oder Sie können 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 Skripte korrekt ausgeführt wurden und die Datensätze wie erwartet betroffen sind. Meiner Meinung nach sollten Sie eine Vorproduktionsumgebung haben und die Datenbank sollte eine Kopie der Produktionsumgebung sein. Auf diese Weise können Sie die Skripts ausführen und die Anwendung in einer ziemlich ähnlichen Umgebung bereitstellen, um festzustellen, ob Probleme auftreten. 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. In Bezug auf die Skripts, wenn das Team mehr als einen Entwickler hat, bevorzuge ich es, die Skripts in Strukturskripten und Datenskripten zu kategorisieren. Strukturskripts ändern die Struktur der Datenbank (fügen Sie eine Tabelle hinzu, fügen Sie eine Spalte zu einer Tabelle hinzu usw.) und Datenskripts fügt Datensätze ein/aktualisiert/löscht sie. 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 für die Registrierung der ausgeführten Skripte. Zum 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, überprüft es seine Abhängigkeiten. Dazu überprüft es, ob die Skripte ausgeführt wurden (existiert in der Tabelle ExecutedScriptsHistory).

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

9

Ich weiß, dass die Frage bereits beantwortet, aber für die Zukunft:

Eine der Optionen ist so etwas wie dies im Konstruktor Ihrer DB Kontextklasse zu setzen:

public MyDbContext() 
    { 
     System.Data.Entity.Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyDbContext, Configuration>());    
    } 
+3

Obwohl dieser Ansatz die Arbeit erledigt, muss diese Codezeile definitiv nicht jedes Mal ausgeführt werden, wenn MyDbContext instanziiert wird. Wenn man also diesen Ansatz verwendet, ist es sinnvoll, diesen Code in den statischen Konstruktor der 'MyDbContext'-Klasse aufzunehmen. Oder in 'Application_Start' Methode in' Global.asax.cs' Datei. Oder woanders nahe genug am Kompositionswurzel einer Anwendung. – Deilan

+0

Danke. Diese einfache Lösung hat mir den Tag verschönert. – Sam

0

nur zu Gib jedem die einfache Antwort.

Dies ist die "Update-Datenbank" In Ihrem Migrations-Ordner Configuration.cs:

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

Und auf "Enable-Migrationen" in erster Linie auf einem Remote-Server, fügen Sie diese zu Ihrem Global. asax.cs Datei:

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

Beachten Sie, dass dies in einigen Versionen von EF zu Datenverlust führen kann. Es gibt Versionen von EF, die bei einer Spaltenumbenennung die alte Spalte löschen und die neue erstellen. Wenn Sie Ihren Code anwenden (insbesondere den 'DataLossAllowed = true' Teil), werden Sie am Ende Daten verlieren. – Michel

1

eine einfache Lösung: Update-Database von Ihrer lokalen Paket-Manager-Konsole ausgeführt werden mit der Produktion Verbindungszeichenfolge eine Verbindung String-Parameter bereitstellt. Sie haben auch die Verbindung Anbieternamen (SqlServer in diesem Beispielcode) liefern:

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

Anstelle der Verbindungszeichenfolge eine Verbindung string name connectionStrings Abschnitt in Ihrem app.config-Datei verwenden können:

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

Sie müssen über Berechtigungen zum Zugriff auf diesen Server von Ihrem lokalen Computer verfügen. Wenn Sie beispielsweise eine Verbindung mit dem Server über ein Sql Server Management Studio herstellen können, können Sie dies verwenden.

Beachten Sie, dass dieser Ansatz nicht für ein reales Produktionssystem empfohlen wird, Sie sollten etwas verwenden, was in der akzeptierten Antwort erklärt wird. Aber es kann Ihnen bei schnellen Hacks in entfernten Entwicklungsservern, Testumgebungen usw. helfen.