c# - studio - scaffold dbcontext update
La base de datos de actualizaciĆ³n falla debido a cambios pendientes, pero Add-Migration crea una migraciĆ³n duplicada (3)
Estoy trabajando con Entity Framework 5.0 Code First Migrations, y tengo un problema con la ejecución de Update-Database. Dice que hay cambios de modelo pendientes; pero debería estar al día, así que corro
Add-Migration SomeMigrationName
y crea un archivo ... sin embargo, crea un archivo que es esencialmente el mismo que un duplicado de una migración anterior (si trato de actualizar la base de datos nuevamente en ese archivo, falla con los problemas relacionados con el intento de eliminar un archivo no actualizado). restricción existente). Además, he podido confirmar que la migración "original" se ha ejecutado en función del modelo de datos en la base de datos y de la presencia de un registro en la tabla __MigrationHistory.
Si elimino toda la base de datos y vuelvo a ejecutar todas las migraciones, de forma automática o manual, tengo el mismo problema.
El archivo de migración ''original'' que tenía es el siguiente:
public partial class RenameLinkColumns : DbMigration
{
public override void Up()
{
DropForeignKey("dbo.Listing", "OfferedByUserId", "dbo.User");
DropIndex("dbo.Listing", new[] { "OfferedByUserId" });
AddColumn("dbo.Listing", "ListedByUserId", c => c.Int(nullable: false));
AddForeignKey("dbo.Listing", "ListedByUserId", "dbo.User", "UserId", cascadeDelete: true);
CreateIndex("dbo.Listing", "ListedByUserId");
DropColumn("dbo.Listing", "OfferedByUserId");
}
public override void Down()
{
AddColumn("dbo.Listing", "OfferedByUserId", c => c.Int(nullable: false));
DropIndex("dbo.Listing", new[] { "ListedByUserId" });
DropForeignKey("dbo.Listing", "ListedByUserId", "dbo.User");
DropColumn("dbo.Listing", "ListedByUserId");
CreateIndex("dbo.Listing", "OfferedByUserId");
AddForeignKey("dbo.Listing", "OfferedByUserId", "dbo.User", "UserId", cascadeDelete: true);
}
}
Cuando ejecuté nuevamente Add-Migration, los métodos Arriba / Abajo en ese archivo son exactamente los mismos que estos.
Estoy bastante impresionado de que las migraciones pudieron detectar correctamente que había cambiado el nombre de una columna ForeignKey; ¿Pero es eso lo que está causando que esto se ahogue?
Parece que hay una solución alternativa: he eliminado la base de datos y todos los archivos de migración, y he creado una nueva migración ''inicial'', pero preferiría no hacerlo si es posible.
Actualización: Esta no fue la última migración que causó este problema, pero el problema comenzó después de una fusión (estoy trabajando solo, pero estoy simulando el trabajo en equipo en las sucursales para aprender más sobre Git también), y tratando de poner la base de datos al paso. la fusión. Podría haberse producido esto al colocar las migraciones en algún orden en particular después de una fusión, aunque se observó que las migraciones funcionaron como se esperaba en el orden en que se ejecutaron cuando les entregué un DB vacío.
Además, esta migración original necesitaba ajustes manuales cuando las tablas tenían datos, porque los datos debían copiarse de la columna anterior a la nueva. Sin embargo, probé ese archivo con y sin mis ediciones manuales en ese archivo, y aún encontré el comportamiento observado.
Acabo de enfrentar el mismo problema.
Una vez creada la migración. Intenté actualizar la base de datos y recibí el siguiente mensaje:
No se puede actualizar la base de datos para que coincida con el modelo actual porque hay cambios pendientes y la migración automática está deshabilitada. Escriba los cambios de modelo pendientes en una migración basada en código o habilite la migración automática. Establezca DbMigrationsConfiguration.AutomaticMigrationsEnabled en true para habilitar la migración automática. Puede usar el comando Agregar migración para escribir los cambios de modelo pendientes en una migración basada en código.
Luego, volví a generar la migración pero fue duplicada.
El problema se resolvió cuando construyo el proyecto después de crear la migración. Luego, el script Update-Database encuentra el método de migración y funciona. Al menos para mi caso.
Veo esto todo el tiempo también. No sé por qué, ojalá lo hiciera, pero mi solución es hacer una migración adicional que haga un duplicado. Ahora este duplicado se abre en el editor y luego lo edito, de modo que los métodos Arriba y Abajo están vacíos. ¡Entonces el resultado es un archivo de migración que no hace nada! VS está contento y puede hacer la actualización de la base de datos sin errores (hasta la próxima vez).
Espero que esto ayude :)
Esta respuesta explica por qué sucede . Para resolverlo, llamo add-migration
y lo denomino MERGE
y luego elimino cualquier código de migración duplicado que ya haya ocurrido. Esto es solo para actualizar la instantánea del modelo para reflejar el modelo fusionado.
Ejemplo:
public partial class MERGE : DbMigration
{
public override void Up()
{
// Intentionally left blank.
// This may seem like a hack, but it is necessary when using source control.
// When a migration is created via add-migration, EF creates
// an .edmx file from the current code first classes. It compares this .edmx to the .edmx stored in the last migration before this,
// which I''ll call it''s parent migration. The edmx snapshots are gzipped and stored in base64 in the resource files (.resx) if you
// want to see them. EF uses the difference between these two snapshots to determine what needs to be migrated.
// When using source control it will happen that two users add entities to the model independently. The generated edmx snapshots will
// only have the changes that they have made. When they merge in source control, they will end up with this:
// Migration | Snapshot Contents
// -------------------------------- | ----------------
// 20150101_Parent Migration | A
// 20150102_Developer 1''s Migration | A + Change 1
// 20150103_Developer 2''s Migration | A + Change 2
// So calling add-migration will create the current snapshot edmx from the Code First model and compare it to the
// the latest migration''s snapshot, which is A + Change 2, and see that Change 1 is missing. That is why it
// creates a duplicate migration. We know that the migrations have already been applied, so the only thing that this
// migration will do is update the current snapshot .edmx so that later migrations work fine.
}
public override void Down()
{
}
}
`` `