wake-up-neo.net

So führen Sie die Seed () - Methode der Konfigurationsklasse der Migrationen aus

Ich habe 2 Fragen:

1) Wie kann ich die Seed () - Methode von der Paket-Manager-Konsole aus ausführen, ohne das Datenbankmodell zu aktualisieren?

2) Gibt es eine Möglichkeit, die Seed () -Methode im Code aufzurufen?

Danke für jeden Rat.

37
Maris

Nach Recherchen fand ich endlich den Workaround für dieses Problem:

1) Machen Sie Configuration öffentlich:

public sealed class Configuration : DbMigrationsConfiguration<YourContextClassHere>

2) Fügen Sie den Code an einer beliebigen Stelle ein. Es wird die letzte Migration ausgeführt und Ihre Datenbank aktualisiert:

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();
23
Maris

Beantworten Sie Ihre erste Frage. Erstellen Sie eine Migration, indem Sie add-migration SeedOnly ausführen

Löschen Sie den generierten Up () - und Down () - Code, wenn Änderungen anstehen

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

    public override void Down()
    {
    }
}

Anschließend können Sie eine bestimmte Migration anvisieren, indem Sie update-database-TargetMigration SeedOnly in der Package Manager-Konsole ausführen

37
De Wet Ellis

Beantwortung von Frage 2: Extrahieren Sie den gesamten Code aus der Seed () - Methode in eine andere Klasse. Rufen Sie dann das innerhalb der Seed () -Methode aus der Configuration-Klasse auf:

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

Dann können Sie es von überall aus anrufen:

    new DatabaseSeed().Seed(new DbContext());
5
leifbattermann

Beantworte Frage 1:

Die Leute würden das normalerweise umgehen, indem sie entweder:

  1. Vorübergehende künstliche Änderung des Modells
  2. Wechsel zu DropCreateDatabaseAlways mit der Folge, dass die Datenbank häufig gelöscht und erneut erstellt wird, wenn sie nicht benötigt wird
  3. Datenbank manuell löschen

referenz: http://blog.oneunicorn.com/2013/05/28/database-initializer-and-migrations-seed-methods/

2
Farb

Dies ist nicht genau das, wonach Sie suchen, aber werfen Sie doch einen Blick darauf: Ausführen von Entity Framework-Migrationen über die Befehlszeile Prompt Dies kann Ihnen oder jemandem helfen, die anwendungsbasierte Datenbankmigration zu vergessen, da Sie problemlos Skripts erstellen können automatisch laufen ...

1
soreal

Ich weiß, dass dies eine sehr alte Frage ist, aber für den Fall, dass jemand hier eintritt und zum Zweck des Informationsaustauschs:

Für mich ist die einfachste Möglichkeit, Frage 1 zu beantworten, die Lösung von Frage 2 und die Verwendung des Ergebnisses zur Lösung der ersten Frage. Und das wäre so einfach, wie @leifbattermann oben geantwortet hat ( https://stackoverflow.com/a/24413407/2996749 ) oder auch @Martin Staufcik-Methode, und rufen Sie dann einfach die Funktion/Methode auf Code, den Sie ausführen können, wann immer Sie möchten, mit dem erstaunlichen Vorteil, dass er zum Festlegen von Standardwerten in bestimmten Szenarien verwendet werden kann, z. B. zum Erstellen neuer Datenbanken für neue Kunden.

Vergessen Sie jedoch nicht, dass Sie SaveChanges () aufrufen müssen, wenn Sie die @ leifbattermann-Methode verwenden und die Funktion von einer anderen Stelle als der Configuration-Klasse aufrufen und einen neuen DbContext erstellen. Zumindest für mich war das der Weg.

Nur noch eine Sache: Wenn Sie keine ausstehenden Migrationen haben und nur Seed möchten, können Sie den Befehl "update-database" in der Package Manager Console ausführen.

0
rjr.sousa

Fügen Sie der Configuration-Klasse eine neue öffentliche Methode hinzu. Die neue Methode ruft nur die geschützte Methode Seed auf:

public void RunSeed(DbContext db)
{
    Seed(db);
}

Rufen Sie dann die neue Methode auf, z. ein Unit-Test:

var db = new SomeDbContext();
var configuration = new Configuration();
configuration.RunSeed(db);
0
Martin Staufcik

Wenn Sie context initiliazer als MigrateDatabaseToLatestVersion verwenden, sollte die Seed-Methode in der Konfiguration automatisch ausgeführt werden. Denken Sie nicht, dass Sie es manuell aufrufen müssen.

0
Ravi