¿Cómo puedo detener la Adición de Migraciones cuando mi base de datos no tiene migraciones pendientes cuando utilizo migraciones basadas en Código?
Estoy investigando el uso de migraciones de EF basadas en código para un producto queno utilizar EF. Generalmente todo funciona bien, excepto que el comando:
Add-Migration MyTestMigration
emite el siguiente mensaje:
No se puede generar una migración explícita porque están pendientes las siguientes migraciones explícitas: [201206260845338_DannyTest]. Aplique las migraciones explícitas pendientes antes de intentar generar una nueva migración explícita.
La razón de esto es que la cadena de conexión no se conoce en el momento de la compilación, y EF ha creado al azar una base de datos llamada "MyContextName" en. \ SQLExpress. No puedo aplicar la migración pendiente, ya que hace referencia a las tablas de base de datos que no existen en esta base de datos; solo estamos tratando de usar las migraciones como una forma de ejecutar nuestros scripts;
Así que las preguntas son:
Si no estamos usando migraciones automáticas (tenemos EnableAutomaticMigrations = false), ¿por quéAdd-Migration
Requerir que la base de datos esté actualizada.A pesar de que no tiene absolutamente ningún impacto en la migración generada (vacía)? Me resulta difícil creer que la EM no intente este caso de uso cuando tanto de esto funciona; Lo único "roto" es la validación que no afectaalguna comportamiento.
¿Hay alguna otra forma de evitar esto con la creación de nuestro propio comando Add-Migration que simplemente duplica lo que hace EF, pero omite la verificación actualizada de DB (aparentemente innecesaria)? He intentado pasar varios argumentos, pero hasta ahora no he logrado hacer que funcione.
Editar:De hecho, encontré una mejor manera de resolver este problema, pero no es realmente una respuesta a estas preguntas, por lo que lo agregué aquí. Esperemos que tenga tiempo para convertir esto en unentrada en el blog!
La única razón por la que quise usar Add-Migration fue debido a todos los guff que acompañaron a DbMigration; pero me di cuenta de que con una clase base, básicamente podríamos eliminar la necesidad de todo esto haciendo que la clase base genere automáticamente el ID de migración de un atributo. El objetivo es idéntico para todas nuestras migraciones, ya que el estado del modelo no cambia. Ahora, solo creamos manualmente nuestras migraciones de esta manera (se requiere la fecha para crear la ID, de manera que EF las aplique en el orden correcto):
[Migration(2012, 6, 27, 12, 00, "Add new xxx fields for yyy")]
internal class MyNewMigration : MyDbMigration
{
public override Up()
{
// ...
}
public override Down()
{
// ...
}
}
losMyDbMigration
clase tiene las propiedades de Destino / Fuente / Id. El destino está codificado (el mismo valor que Add-Migration creó con la primera migración), Source es nulo e Id es una reflexión que lee el atributo MigrationAttribute. Esto significa que ahora podemos crear estas clases manualmente; lo cual no es mucho esfuerzo ahora, no tenemos que preocuparnos por todo lo relacionado con IMigrationMetadata :-)