recientemente he cambiado de una aplicación desde el uso de los siguientes para dev:La confusión sobre EF Auto Migraciones y siembra - la siembra de cada programa se inicia
DropCreateDatabaseIfModelChanges<Context>
Para usar:
public class MyDbMigrationsConfiguration: DbMigrationsConfiguration<GrsEntities>
{
public MyDbMigrationsConfiguration()
{
AutomaticMigrationsEnabled = true;
AutomaticMigrationDataLossAllowed = true;
}
}
En mi contexto db tengo:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// Tell Code First to ignore PluralizingTableName convention
// If you keep this convention then the generated tables will have pluralized names.
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
//set the initializer to migration
Database.SetInitializer(new MigrateDatabaseToLatestVersion<GrsEntities, MigrationConfig>());
}
He reemplazado a Seed (contexto) en DbMigrationsConfiguration usando la extensión AddOrUpdate donde estaba usando Agregar antes con siembra en el drop db (DropCreateDatabaseIfModelChanges).
Mi confusión es que la migración se ejecuta con cada inicio de la aplicación independientemente de que haya cambios en el DbContext. Cada vez que inicio la aplicación (la biblioteca se ejecuta a través de un servicio) el inicializador se ejecuta igual que la semilla. Mi comportamiento esperado es comprobar si una migración es necesaria (verificar entre bastidores para ver si el modelo coincide con la base de datos física) luego actualizar las tablas/columnas nuevas/eliminadas y solo ejecutar la semilla si algo ha cambiado.
En mi prueba, la semilla se ejecuta todo el tiempo, lo que es factible pero aparentemente ineficiente y no era lo que esperaba. Lamentablemente, la documentación de MSDN es bastante limitada.
¿Hago un uso incorrecto de MigrateDatabaseToLatestVersion? ¿Hay alguna manera de obtener el comportamiento que espero (es decir, solo semilla si hay un cambio de modelo) o debería simplemente cambiar mi método de inicialización para esperar que se ejecute cada lanzamiento de la aplicación?
Gracias Arthur. Eso fue claro, conciso y justo lo que estaba buscando. Terminé cambiando mi semilla para asumir que correría todas las veces, pero es bueno saber la historia detrás de ella (que no pude encontrar). – dubbreak
El hecho de que el método de inicialización solo se ejecute cuando se realizó una migración y ahora el método de inicialización se ejecuta cada vez que se utiliza el contexto por primera vez es muy confuso. ¿Hay algún artículo de MSDN en alguna parte que detalle este cambio? –