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.
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.
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();
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? –
Ich zweite, dass .. –
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.
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
Eine Option ist das Erstellen von SQL-Skript für die Verwendung in der Migration. Dies kann mithilfe der Aktualisierungsdatenbank -script -targetmigration erreicht werden:
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());
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
Ich nehme an, das ist die beste Antwort. Es ist erstaunlich, dass es zu wenige Upvotes gibt! – ehsan88
Antwort Frage 1:
Menschen in der Regel würden entweder dieses Problem umgehen:
Referenz: http://blog.oneunicorn.com/2013/05/28/database-initializer-and-migrations-seed-methods/
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 ...
Yeap, könnte es nützlich sein für CI. Vielen Dank. – Maris
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
ok, das ist ziemlich hässlich * grins * – tofutim
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