2017-06-16 3 views
0

Es gab eine bahnbrechende Änderung, so dass wir beschlossen, Migrationen zurückzusetzen, aber jetzt, wenn wir nicht setzen -EnableAutomaticMigrations Option Enable-Migrations funktioniert nicht. Meine Verbindungszeichenfolge befindet sich in meinem Webprojekt, das als Startprojekt festgelegt ist.Warum kann ich Code-Migrationen nur aktivieren, wenn auch automatische Code-Migrationen aktiviert sind?

Dies sind die Schritte, die wir haben:

Erste Wir löschte den Migrations-Ordner und die Datenbank vollständig. Dann Wenn wir das tun:

enable-migrations 

Wir erhalten:

prüfen, wenn der Kontext eine bestehende Datenbank zielt ...

kann nicht Datenbank aktualisieren, um das aktuelle Modell entsprechen, weil es anhängig Änderungen und automatische Migration ist deaktiviert. Schreiben Sie die ausstehenden Modelländerungen in eine codebasierte Migration oder aktivieren Sie die automatische Migration. Setzen Sie DbMigrationsConfiguration.AutomaticMigrationsEnabled auf , um die automatische Migration zu aktivieren.

Ich verstehe diesen Fehler nicht, es gibt keine Datenbank, es gibt keine Migrationen, auf welche ausstehenden Änderungen bezieht es sich? (Ich nicht sogar chanves in git haben pending)

Wenn dann tun wir

enable-migrations -EnableAutomaticMigrations 

Es funktioniert, aber wenn wir folgen ihm mit:

Add-Migration InitialCreation 

Es schafft eine Leere InitialCreation Migration und es erstellt die Datenbank mit den Tabellen, die meinem Modell entsprechen. Aber das tun wir können nicht die Skripte für das Erstellen der Datenbank zum ersten Mal. Ich verstehe nicht, was vor sich geht. Es scheint das erste Mal, dass es einige automatische Migration verwendet.

Warum können wir nicht enable-migrations ohne -EnableAutomaticMigrations?

aktualisieren

mit Steve Green Nach einem Gespräch, ich denke, es könnte nützlich sein Teil meines DbContext und Initializer

public class ApplicationDatabaseContext : DbContext 
    { 
     public ApplicationDatabaseContext() 
      : base("MyConnectionStringName") 
     { 
      Database.SetInitializer<ApplicationDatabaseContext>(new ApplicationDataInitializer()); 

      if (!Database.Exists()) 
      { 
       Database.Initialize(true); 
      } 
     } 

Und mein DatabaseInitializer hinzuzufügen:

public class ApplicationDataInitializer : CreateDatabaseIfNotExists<ApplicationDatabaseContext> 
    { 
     protected override void Seed(ApplicationDatabaseContext context) 
     { 
      base.Seed(context); 

      CreateData(context); 
     } 

     private void CreateData(ApplicationDatabaseContext context) 
     { 
      //Add data here 
      context.SaveChanges(); 
     } 
    } 

Antwort

0

Erste Stellen Sie sicher, dass Sie den Initializer MigrateDatabaseToLatestVersion gesetzt haben.

Zweitens sollten Sie automatische Migrationen nicht aktivieren müssen. Um Migrationen zurückzusetzen, müssen Sie nicht den gesamten Ordner löschen (insbesondere wenn Sie in der Klasse Configuration() einige Seeding- oder andere Anpassungen vorgenommen haben).Löschen Sie einfach die einzelnen Migrationen dann eine neue Baseline Migration hinzu:

add-migration MyStartPoint -IgnoreChanges

Dies ist ein Überblick ohne Code in der oben nehmen(), da Sie wirklich nicht, dass brauche ein Skript zu erzeugen, um die Datenbank zu erstellen . Jetzt sollte update-database -Script -SourceMigration $InitialDatabase ein Skript erstellen, mit dem Sie eine neue Datenbank erstellen können.

Eine andere Option ist die Verwendung einer initializer wie CreateDatabaseIfNotExist, die genau das tun wird.

+0

Wir haben den Initiator CreateDatabaseIfNotExist. Ich bin neu bei EF und Migrationen, habe mir bei einigen Microsoft Tutorials den gesamten Ordner gelöscht, deshalb haben wir es gemacht. Dies ist auch die Anzahl der Orte, an denen Migrationen zurückgesetzt werden können. Wie legen Sie die MigrateDatabaseToLatestVersion fest, wenn Sie einen CreateDatabaseIfNotExist Initliazer verwenden? – Dzyann

+0

Sie brauchen nicht beide. MigrateDatabaseToLatestVersion erstellt die Datenbank, wenn sie nicht existiert, solange Sie diese Baseline, die erste Migration, haben. Setzen Sie es in den statischen Konstruktor des Kontextes. –

+0

Hallo Steve, ich habe meinen DbContext-Konstruktor und den Initialisierer meinem Beitrag hinzugefügt. Wir hatten die gleichen Dinge zuvor und hatten kein Problem, die EF Migrationen zurückzusetzen. Und jetzt geht es plötzlich nicht mehr. – Dzyann

Verwandte Themen