update migraciones habilitar framework first code c# entity-framework code-first ef-migrations

c# - habilitar - Cómo ejecutar el método Seed() de la clase de configuración de migraciones



habilitar migraciones entity framework (8)

Agregue un nuevo método público en la clase de Configuration . El nuevo método solo llama al método protegido Seed :

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

Luego llame al nuevo método de, por ej. una prueba unitaria:

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

Tengo 2 preguntas:

1) ¿Cómo puedo ejecutar el método Seed () desde la consola del administrador de paquetes sin actualizar el modelo de la base de datos?

2) ¿Hay alguna manera de llamar al método Seed () en el código?

Gracias por cualquier consejo.



Después de la investigación, finalmente encontré la solución para este problema:

1) Hacer que la Configuration pública:

public sealed class Configuration : DbMigrationsConfiguration<YourContextClassHere>

2) Agregue el código a continuación en cualquier lugar. Ejecutará la última migración y actualizará su base de datos:

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



Respondiendo la pregunta n. ° 2: extrae todo el código del método Seed () a otra clase. Luego llama eso desde el método Seed () de la clase Configuration:

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

Entonces puedes llamarlo desde cualquier lugar:

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


Respondiendo tu primera pregunta. Cree una migración ejecutando add-migration SeedOnly

Borre todos los códigos Arriba () y Abajo () generados si hubo cambios pendientes

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

A continuación, puede orientar una migración específica ejecutando la base de datos de actualización -TargetMigration SeedOnly en la consola de Package Manager


Si desea Update-Database --Target-Migration xxx y se sorprende al Update-Database --Target-Migration xxx que el método seed() no se ha ejecutado, puede intentar git stash todos sus cambios, generar la base de datos de la versión anterior usando Update-Database ( a la última revisión que ejecuta seed() siempre) y git stash apply continuación.

Es una solución fea pero me ayudó.

Por cierto: no te olvides de organizar tus cambios antes de esconder


Si usa el iniciador de contexto como MigrateDatabaseToLatestVersion, el método seed en la configuración debe ejecutarse automáticamente. No piense que necesita llamarlo manualmente.