2016-06-26 21 views
0

Ich möchte Datenbank nach Code zuerst migrieren. Zum Beispiel habe ich 3 Entity in contex und 1 Tabelle in der Datenbank, und es gibt ein Problem, wenn ich Programm ausführen und diesen Fehler erhalten: Es gibt bereits eine Tabelle.Warum Code First Migration Keine Update-Tabelle, die in DataBase vorhanden ist?

Migration Konfiguration

internal sealed class Configuration : DbMigrationsConfiguration<ApplicationDbContext> 
{ 
    public Configuration() 
    { 
     AutomaticMigrationsEnabled = false; 
     // AutomaticMigrationDataLossAllowed = false; 
    } 

    protected override void Seed(ApplicationDbContext context) 
    { 
     // This method will be called after migrating to the latest version. 


    } 
} 

IdentityModel

public ApplicationDbContext() : base("DefaultConnection") 
    { 
     Database.SetInitializer<ApplicationDbContext>(new MigrateDatabaseToLatestVersion<ApplicationDbContext, Migrations.Configuration>()); 
    } 

jede mögliche Hilfe?

+1

Können Sie lassen Sie uns wissen die genauen Fehler Botschaft? –

+0

Ja, das ist: Es gibt bereits ein Objekt namens 'TClientsAdmins' in der Datenbank. –

+0

Versuchen Sie, Ihre 'AutomaticMigrationsEnabled = false' auf' true' zu ​​setzen. –

Antwort

3

Haben Sie versucht, die Add-Migration "migration_name" vor dem Aufruf der Update-Datenbank zu verwenden? Oder versuchen Sie vielleicht, Update-Database -Force zu verwenden.

Ansonsten habe ich einige Schritte gefunden, die vielleicht nützlich sein könnten:

  1. den vorhandenen Migrations-Ordner in Ihrem Projekt entfernen, und legen Sie die Tabelle __MigrationHistory aus der vorhandenen Datenbank.
  2. Führen Sie den Befehl enable-migrations von der Package Manager-Konsole aus.
  3. Führen Sie den Befehl add-migration aus, um eine anfängliche Migration zu erstellen.
  4. Entfernen Sie den gesamten Code in der Up() - Methode für die anfängliche Migration.
  5. Führen Sie den Befehl update-database aus, um die anfängliche Migration auf Ihre Datenbank anzuwenden. Dadurch werden vorhandene Objekte nicht geändert (da die Up() -Methode keinen Code enthält), sondern die vorhandene Datenbank wird als in den ursprünglichen Zustand migriert markiert.
  6. Nehmen Sie Änderungen an Ihrem Code-First-Modell vor.
  7. Führen Sie den Befehl add-migration aus, um eine neue Migration zu erstellen. Der Code in der Up() - Methode der neuen Migration enthält nur die Änderungen an Ihrem Objektmodell.
  8. Führen Sie den Befehl update-database aus, um die Änderungen auf Ihre Datenbank anzuwenden.
+0

Ich füge bereits die Migration hinzu –

0

Das ist ein häufiges Problem mit Migrationen. Wenn Sie eine neue Migration hinzufügen, wird das aktuelle Codemodell mit dem vorherigen Codemodell verglichen, das in der vorherigen Migration gespeichert wurde. Wenn dies die erste Migration ist, wird somit Code für alles erzeugt, daher versucht der Code manchmal, bereits existierende Objekte hinzuzufügen.

Um dies zu umgehen, können Sie den Code in der Up() - Methode der Migration für die bereits vorhandenen Elemente auskommentieren und dann die Migration anwenden (update-database). Jetzt werden nur die Änderungen, die sich vorwärts bewegen, korrekt generiert.

Um dies zu verhindern, sollen Sie immer eine Anfangsmomentaufnahme Ihrer Datenbank generieren, ohne Änderungen zu erzeugen:

add-migration MyStartingPoint -IgnoreChanges // ignorechanges flag tells EF to just take snapshot with no code in Up() 

Hier ist ein Dokument, wie Migrationen arbeitet "under the hood".

+0

Ich setze ur code, bekomme aber diesen Fehler: In der Assembly 'ProjectName' wurde kein Migrationstyp gefunden. (In Visual Studio können Sie den Befehl "Enable-Migrations" in der Package Manager-Konsole verwenden, um eine Migrationskonfiguration hinzuzufügen.) –

+0

Wenn Sie Migrationen aktiviert haben, müssen Sie als Nächstes prüfen, ob in der Package Manager-Konsole das richtige Projekt ausgewählt ist. Sie müssen das Projekt auswählen, in dem die Migrationen vorhanden sind, oder einen Parameter zu Ihrem Befehl hinzufügen, der auf diesen verweist. –