2013-05-28 5 views
28

Ich habe 2 Fragen laufen?Wie Seed() -Methode von Configuration-Klasse von Migrationen

2) Gibt es einen Weg, wie Seed() Methode im Code aufgerufen wird?

Thx für jede Beratung.

+1

ich in dieser Ausgabe lief mit EF6 stashing und dann erkannte ich die falsche Standardprojekt gewählt hatte, so dass die Update-Datenbank nicht um eine Konfiguration zu laufen zu finden. Es ist gut zu bemerken, dass das Ausführen einer Update-Datenbank in EF6 immer die Seed() -Methode ausführt. Ich weiß nicht, ob das zur Zeit der Niederschrift stimmte. – allen1

Antwort

20

Nach Forschung fand ich endlich die Abhilfe für dieses Problem:

1) Stellen Sie Configuration public:

public sealed class Configuration : DbMigrationsConfiguration<YourContextClassHere> 

2) Fügen Sie den Code unten an jedem Ort. Es wird die letzte Migration ausführen und Ihre Datenbank aktualisieren:

Configuration configuration = new Configuration(); 
configuration.ContextType = typeof(YourContextClassHere); 
var migrator = new DbMigrator(configuration); 

//This will get the SQL script which will update the DB and write it to debug 
var scriptor = new MigratorScriptingDecorator(migrator); 
string script = scriptor.ScriptUpdate(sourceMigration: null, targetMigration: null).ToString(); 
Debug.Write(script); 

//This will run the migration update script and will run Seed() method 
migrator.Update(); 
+12

Dies beantwortet den zweiten Teil der Fragen, aber was ist mit dem ersten Teil Wie kann ich Seed() -Methode von der Paket-Manager-Konsole ohne Update-Datenbankmodell ausführen? –

+1

Ich zweite, dass .. –

0

Wenn Sie den Kontext initiiliazer als MigrateDatabaseToLatestVersion verwenden, sollte die Startmethode in der Konfiguration automatisch ausgeführt werden. Denken Sie nicht, dass Sie es manuell aufrufen müssen.

+0

Aber was, wenn ich es manuell nennen möchte? Ich habe update-database in der Paketmanager-Konsole erstellt und lasse meine Seed() -Methode ausführen. Aber ich mache danach einen Job, der die Informationen in DB löscht. Also ich möchte die Seed() Methode unabhängig von Update-Datenbank ausführen. Irgendwelche Ideen? – Maris

+0

Eine Option ist das Erstellen von SQL-Skript für die Verwendung in der Migration. Dies kann mithilfe der Aktualisierungsdatenbank -script -targetmigration erreicht werden: . Sobald das Skript erstellt wurde, können Sie am Ende des Skripts alle gewünschten Seed-Informationen hinzufügen. Dies wären SQL-Anweisungen zum Einfügen. Sie können das Skript in der up-Methode der erstellten Migrationsdatei ausführen. – Ravi

3

antwortende Frage # 2: Extrahieren Sie alle den Code aus dem Seed() -Methode in einer anderen Klasse. Dann, dass Anruf aus dem Seed() -Methode aus der Klasse Konfiguration:

protected override void Seed(DbContext ctx) 
    { 
     new DatabaseSeed().Seed(ctx); 
    } 

Dann können Sie es von überall anrufen:

new DatabaseSeed().Seed(new DbContext()); 
28

Ihre erste Frage zu beantworten. Erstellen Sie eine Migration von laufenden Add-Migration SeedOnly

lösche alle Up() und Down() Code generiert, wenn es eine ausstehende war ändert

public partial class SeedOnly : DbMigration 
{ 
    public override void Up() 
    { 
    } 

    public override void Down() 
    { 
    } 
} 

Dann Sie eine spezifische Migration von laufenden Update-Datenbank Ziel kann -TargetMigration SeedOnly im Paket-Manager-Konsole

+2

Ich nehme an, das ist die beste Antwort. Es ist erstaunlich, dass es zu wenige Upvotes gibt! – ehsan88

1

Dies ist nicht genau das, was Sie suchen, aber werfen Sie einen Blick: Running Entity Framework Migrations via command line prompt Dies kann Ihnen oder jemand helfen, Anwendung basierte Datenbankmig zu vergessen Ration, denn Sie können Skripts einfach so erstellen, dass sie automatisch ausgeführt werden ...

+0

Yeap, könnte es nützlich sein für CI. Vielen Dank. – Maris

0

Wenn Sie Update-Database --Target-Migration xxx wollen, und Sie sind überrascht, wie ich war, dass seed() Methode nicht ausgeführt wurde, können Sie zu git stash alle Änderungen versuchen, generieren Datenbank aus früheren Version Update-Database (letzte Version, die seed() immer läuft) mit und git stash apply dann.

Es ist hässlich Workaround, aber es hat mir geholfen.

Btw: vergessen Sie nicht, Ihre Änderungen auf die Bühne, bevor

+0

ok, das ist ziemlich hässlich * grins * – tofutim

Verwandte Themen