web-dev-qa-db-fra.com

Comment exécuter la méthode Seed () de la classe de configuration des migrations

J'ai 2 questions:

1) Comment puis-je exécuter la méthode Seed () depuis la console du gestionnaire de packages sans mettre à jour le modèle de base de données?

2) Existe-t-il un moyen d’appeler la méthode Seed () dans le code?

Merci pour tout conseil.

37
Maris

Après des recherches, j'ai finalement trouvé la solution de contournement pour ce problème:

1) Rendre public Configuration:

public sealed class Configuration : DbMigrationsConfiguration<YourContextClassHere>

2) Ajoutez le code ci-dessous n'importe où. Il exécutera la dernière migration et mettra à jour votre base de données:

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

Répondre à votre première question. Créer une migration en exécutant add-migration SeedOnly

Effacer tous les codes Up () et Down () générés s'il y avait des modifications en attente

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

    public override void Down()
    {
    }
}

Vous pouvez ensuite cibler une migration spécifique en exécutant update-database -TargetMigration SeedOnly dans la console Package Manager.

37
De Wet Ellis

Réponse à la question n ° 2: Extrayez tout le code de la méthode Seed () dans une autre classe. Appelez ensuite cela depuis la méthode Seed () depuis la classe Configuration:

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

Ensuite, vous pouvez l'appeler de n'importe où:

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

Répondre à la question 1:

Les gens travaillent généralement autour de cela soit:

  1. Faire un changement artificiel temporaire au modèle
  2. Passage à DropCreateDatabaseAlways, avec pour conséquence que la base de données est souvent supprimée et recréée lorsqu'elle n'est pas nécessaire
  3. Suppression manuelle de la base de données

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

2
Farb

Ce n’est pas exactement ce que vous recherchez, mais jetez un oeil: Exécution des migrations d’Entity Framework via la ligne de commande Prompt .__, ce qui peut vous aider, vous ou quelqu'un, à oublier la migration de base de données d’application, car vous pouvez facilement créer des scripts. courir automatiquement ...

1
soreal

Ajoutez une nouvelle méthode publique à la classe Configuration. La nouvelle méthode appelle uniquement la méthode protégée Seed:

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

Appelez ensuite la nouvelle méthode à partir de, par exemple. un test unitaire:

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

Si vous utilisez initiliazer en tant que contexte comme MigrateDatabaseToLatestVersion, la méthode de départ dans la configuration doit être exécutée automatiquement. Ne pensez pas que vous devez l'appeler manuellement.

0
Ravi