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.
Contesta la pregunta 1:
La gente normalmente trabajaría alrededor de esto ya sea:
- Hacer un cambio artificial temporal al modelo
- Cambiar a DropCreateDatabaseAlways, con la consecuencia de que la base de datos a menudo se descarta y vuelve a crear cuando no es necesaria
- Eliminación manual de la base de datos
referencia: http://blog.oneunicorn.com/2013/05/28/database-initializer-and-migrations-seed-methods/
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();
Esto no es exactamente lo que está buscando, pero consulte: Ejecución de migraciones de Entity Framework a través de la línea de comandos. Esto puede ayudarlo a usted oa alguien a olvidar la migración de base de datos basada en aplicaciones, porque puede hacer que las secuencias de comandos se ejecuten automáticamente ...
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.