Entity Framework Code zuerst - wie Update-Database für Produktionsdatenbank ausgeführt wird

77

Ich möchte wissen, wie der Befehl 'Update-Database' für eine Produktionsdatenbank ausgeführt wird.

Die 'Update-Database'-Datenbank funktioniert auf meinem lokalen Computer einwandfrei. Wie kann ich jedoch erreichen, dass dies für Produktionsdaten funktioniert?

Wenn ich also eine Änderung an meiner Anwendung vornehme und dann die Veröffentlichung über Visual Studio ausführe, funktioniert dies auf der Codeseite einwandfrei. Wie führe ich jedoch den Befehl "Update-Database" für die Produktionsdaten aus?

Hoffe diese Frage macht Sinn ...

Vielen Dank,

Ironman
quelle
Sie können die bereitgestellte Datei migrate.exe verwenden, die sich im installierten Nuget-Paket befindet. Siehe Verwendung: msdn.microsoft.com/en-us/library/jj618307(v=vs.113).aspx
Major

Antworten:

25

Um hinzuzufügen, was @David bereits gesagt hat ...

Persönlich vertraue ich nicht automatic updatesauf "Live" -Szenarien und bevorzuge immer die manuelle Datenbankverwaltung (dh es gibt ein Problem beim permissionsErstellen oder Ändern von Db - ganz zu schweigen von Shared Hosting usw.) - aber von dem, was ich gesehen habe Migrationen sind ziemlich solide, wenn es um die Synchronisierung geht (tatsächlich besteht die einzige Möglichkeit, sie normalerweise zu "lösen", darin, die Datenbank zu entfernen und ein vollständiges / neues Update zu erzwingen).

Hier ist ein Beitrag habe ich ein gemachter Vor einiger Zeit auf , wie scriptund synchronize database / codeund darauf ausgerichtet , Einsatzszenarien (und wenn Probleme auftreten). Es trifft (noch) nicht auf Sie zu, aber etwas, das Sie beachten sollten.

MVC3- und Code First-Migrationen - "Das Modell, das den 'bla'-Kontext unterstützt, hat sich seit der Erstellung der Datenbank geändert."

NSGaga-meistens-inaktiv
quelle
2
Warum so kompliziert? Was ist falsch daran, den Migrationscode einfach automatisch auszuführen, wenn die Anwendung gestartet wird / den Kontext zum ersten Mal verwendet? Wie ist ein SQL-Skript besser als das Aufrufen einer C # -Methode?
Florian Winter
1
@FlorianWinter true unter idealen Bedingungen und relativ einfachen Szenarien, und wenn Sie wissen, was Sie tun (z. B. Datenbankverwaltung und Migrationstabelle). Aber eher früher als später stoßen Sie auf einige Probleme, geraten nicht mehr synchron usw. Und Sie haben Live-Daten darin, die nicht um jeden Preis berührt werden dürfen. Ich vertraue wirklich nicht auf Migrationen oder Initialisierer, um diese Arbeit für mich zu erledigen. Und das kommt von unzähligen Problemen, die ich im Laufe der Jahre gesehen habe. Wenn ich also Live-Daten habe, habe ich gerne die volle Kontrolle. Ich kann die App laufen lassen und "sich selbst migrieren", aber erst, nachdem ich sie erneut überprüft habe. Und Skalierung usw.
NSGaga-meistens-inaktiv
Punkt genommen, und ich stimme zu. Ich werde eine Warnung hinzufügen und Ihre Antwort mit meiner Antwort verknüpfen, aber ich werde sie dort belassen, da diese einfachen Szenarien existieren. Zumindest vorübergehend ...
Florian Winter
35

Siehe Verwenden von Entity Framework-Migrationen (Code zuerst) in der Produktion, damit Ihre Anwendung die Datenbank automatisch aktualisiert, wenn das Entity Framework initialisiert wird.

Wenn Sie die manuelle Kontrolle über die Migration bequemer haben, können Sie das Argument -Script für den Befehl Update-Database auf Ihrem Entwicklercomputer verwenden, um SQL-Skripts zu generieren, die Sie dann für die Produktionsdatenbank ausführen können.

http://msdn.microsoft.com/en-us/data/jj591621.aspx (siehe Abschnitt zum Abrufen eines SQL-Skripts)

David Moore
quelle
5

Möchten Sie die Datenbank nur automatisch auf die neueste Version aktualisieren, wann und wo immer Ihre Anwendung ausgeführt wird (Entwicklung und Produktion)?

Dies ist möglicherweise keine gute Idee, außer in sehr einfachen Szenarien, in denen Sie wissen, dass Sie der automatischen Migration vertrauen können und eine manuelle Migration der Datenbank (en) nicht möglich ist. Bitte lesen Sie diese Antwort: https://stackoverflow.com/a/15718190/2279059 . Wenn Sie diese Warnung nicht beachten, lesen Sie weiter.

Fügen Sie Folgendes hinzu web.config:

<entityFramework>
<contexts>
  <context type="MyAssembly.MyContext, MyAssembly" disableDatabaseInitialization="false">
    <databaseInitializer type="System.Data.Entity.MigrateDatabaseToLatestVersion`2[[MyAssembly.MyContext, MyAssembly], [MyAssembly.Migrations.Configuration, MyAssembly]], EntityFramework" />
  </context>
</contexts>

Dies mag beängstigend aussehen, entspricht jedoch im Wesentlichen dem folgenden Code:

Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyContext, Migrations.Configuration>());

Wenn Sie kein Glück haben web.config, können Sie auch versuchen, diesen Code einzugeben Global.asax. Ich persönlich bevorzuge die Konfiguration gegenüber dem Code.

Wenn Ihre Konfigurationsdatei übersichtlicher aussehen soll, können Sie auch eine neue Klasse aus der Vorlagenklasse ableiten, MigrateDatabaseToLatestVersionsodass Sie die kryptische Syntax nicht zum Übergeben von Typargumenten in Ihrer web.cofigDatei verwenden müssen:

public class MyDatabaseInitializer : public MigrateDatabaseToLatestVersion<MyContext, Migrations.Configuration> {}

Dadurch wird ein Datenbankinitialisierer festgelegt, der die Datenbank automatisch auf die neueste Version aktualisiert.

(Quelle und weitere Details: http://www.ralphlavelle.net/2012/09/entity-framework-code-first-webconfig.html )

Florian Winter
quelle
0

Eine andere Lösung, die für mich funktioniert hat, war folgende: In meiner lokalen Datei web.config habe ich die Verbindungszeichenfolge so festgelegt, dass sie auf den Produktionsserver verweist.

Anschließend werden alle PM Console-Befehle auf dem Produktionsserver ausgeführt. Ich kann update-databaseMigrationen nach Bedarf zurücksetzen oder zurücksetzen, und die Änderungen gelten für die Produktionsdatenbank.

Gimmly
quelle