2013-05-28 8 views
28

) Ho 2 domande:Come eseguire dei semi (metodo della classe di configurazione delle migrazioni

1) Come posso eseguire dei semi() metodo dal console package-manager senza modello di aggiornare database?

2) C'è un modo per chiamare il metodo Seed() nel codice?

Thx per qualsiasi consiglio.

+1

mi sono imbattuto in questa edizione con EF6 e poi si rese conto che avevo sbagliato il progetto predefinito scelto, quindi l'aggiornamento del database non ha trovato una configurazione per l'esecuzione. È bene notare che solo eseguendo un database di aggiornamento in EF6 verrà sempre eseguito il metodo Seed(). Non so se questo fosse vero al momento in cui è stato scritto. – allen1

risposta

20

Dopo ricerche ho finalmente trovato la soluzione per questo problema:

1) Assicurarsi Configuration pubblico:

public sealed class Configuration : DbMigrationsConfiguration<YourContextClassHere> 

2) Aggiungere il codice qui sotto ovunque. Verrà eseguito l'ultima migrazione e aggiornare il database:

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

Questo risponde alla seconda parte delle domande, ma per quanto riguarda la prima parte Come posso eseguire il metodo Seed() dalla console di gestione pacchetti senza aggiornare il modello del database? –

+1

Io secondo che .. –

0

Se si utilizza l'inizializzatore di contesto come MigrateDatabaseToLatestVersion, il metodo seed nella configurazione deve essere eseguito automaticamente. Non pensare di aver bisogno di chiamarlo manualmente.

+0

Ma cosa succede se voglio chiamarlo manualmente? Ho creato un database di aggiornamento nella console del gestore pacchetti e ho eseguito il mio metodo Seed(). Ma dopo lo faccio un lavoro che cancella le informazioni nel DB. Quindi voglio eseguire il metodo Seed() indipendentemente dal database di aggiornamento. Qualche idea? – Maris

+0

Un'opzione è creare script sql per utilizzarlo nella migrazione. questo può essere ottenuto usando update-database -script -targetmigration: . Una volta che lo script è stato creato, puoi aggiungere qualsiasi informazione seme alla fine dello script. Queste sarebbero istruzioni SQL insert. È possibile eseguire lo script nel metodo su del file di migrazione creato. – Ravi

3

Rispondendo Domanda # 2: Estrarre tutto il codice dal metodo Seed() per un'altra classe. Quindi chiamare che dall'interno del metodo di Seed() dalla classe di configurazione:

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

quindi è possibile chiamare da qualsiasi luogo:

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

rispondere alla tua prima domanda. Creare una migrazione eseguendo aggiuntivo migrazione SeedOnly

cancellare tutti Su() e Giù() il codice generato se ci fosse qualche modifiche in sospeso

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

    public override void Down() 
    { 
    } 
} 

Poi è possibile destinare una migrazione specifica eseguendo update-base di dati -TargetMigration SeedOnly nella console Package manager

+2

Suppongo che questa sia la migliore risposta. È incredibile che abbia troppi voti positivi! – ehsan88

1

Questo non è esattamente quello che stai cercando, ma comunque dai uno sguardo: Running Entity Framework Migrations via command line prompt Questo può aiutare te o qualcuno a dimenticare il database mig basato su applicazione razione, perché puoi facilmente creare script da eseguire automaticamente ...

+0

Yeap, potrebbe essere utile per CI. Grazie. – Maris

0

Se si vuole Update-Database --Target-Migration xxx e si è sorpreso come mi era che seed() metodo non è stato eseguito, si può provare a git stash tutte le modifiche, generare database da versione precedente utilizzando Update-Database (per ultima revisione che corre seed() sempre) e git stash apply quindi.

È brutta soluzione, ma mi ha aiutato.

BTW: non dimenticate di mettere in scena le modifiche prima stashing

+0

ok, questo è piuttosto brutto * ghigno * – tofutim

Problemi correlati