entity framework - update - atrapado en el limbo de la migración EF
update database entity framework code first (5)
de alguna manera he conseguido que mi proyecto EF5 llegue a un estado en el que no puedo continuar.
Cuando hago una ''actualización-base de datos'' obtengo:
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 del 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 del modelo pendiente en una migración basada en código.
ok, bien, entonces trato de ''agregar-migrar'', y obtengo:
No se puede generar una migración explícita porque las siguientes migraciones explícitas están pendientes: []. Aplique las migraciones explícitas pendientes antes de intentar generar una nueva migración explícita.
20 GOTO 10 ??
¿Qué se supone que debo hacer en este momento? (Más allá de cambiar a NHibernate?)
Cambié el siguiente valor en mi clase Configuration.cs
de false
a true
.
AutomaticMigrationsEnabled = true;
En la carpeta App_Data cambié el nombre de la base de datos de mi proyecto, el archivo con la terminación .mdf (para que se cree uno nuevo) y en la consola del Administrador de paquetes escribí el siguiente comando:
actualizar base de datos
después de lo cual las migraciones pendientes se desarrollaron sin problemas.
Tenga en cuenta que esto funcionó para mí, pero no estoy al 100% si esta es la mejor práctica. En cualquier caso, esta primera guía del Código del Entity Framework para migraciones dice:
"Si aparece un error que indica que una tabla ya existe y no se puede crear, es probable que sea porque ejecutó la aplicación después de eliminar la base de datos y antes de ejecutar la actualización de la base de datos. En ese caso, elimine el archivo Movies.mdf de nuevo y vuelva a intentar el comando update-database. Si aún recibe un error, elimine la carpeta de migraciones ... "
También sobre AutomaticMigrationsEnabled = true;
este artículo de MSDN, Puntos de datos: Un primer misterio de las migraciones de código: Solucionado dice "Las migraciones se pueden ejecutar automáticamente, lo que significa que los cambios del modelo se descubrirán y las migraciones correspondientes a los cambios se crearán y ejecutarán en la base de datos. Inicialización de la base de datos. Las migraciones automáticas son prácticas para aplicaciones simples, pero usted tiene muy poco control sobre ellas y normalmente no recomiendo habilitarlas. Me alegré cuando Code First cambió el valor predeterminado a falso. "
Entendí esto por
- Ejecute "Update-Database -Script -Force"
- tenga en cuenta la última migración explícita intentada antes del error "No se puede actualizar la base de datos ..."
- Ejecute "Update-Database -Script -TargetMigration [lastmigration]" utilizando la última migración observada en el intento anterior
Podría ejecutar el script y agregar una nueva migración. Esto está en EF6 y Nuget 2.8. Puede que no haya funcionado cuando se publicó la pregunta.
Lo que funcionó para mí fue:
- Revertir todos mis cambios (hacer una copia de seguridad primero) a un buen estado conocido.
- Haciendo
add-migration DummyMigration
. Eso produjo algunos cambios espurios que comenté - Se llamó
update-database
para agregar los metadatos de migración a la tabla[__MigrationHistory]
. - Realice los cambios que necesitaba (de la copia de seguridad del código que tomé antes).
- Haga la
add-migration
-update-database
/update-database
normal.
No es ideal, y sería genial ver si hay una solución mejor, pero eso funcionó para mí.
Me equivoqué en la base de datos de creación
using System.ComponentModel.DataAnnotations;
using System.Globalization;
namespace ProductsManager.Models
{
public class Product
{
public int ProductId { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public string Production { get; set; }
public string Size { get; set; }
public decimal<--- Price { get; set; }
public string Barcode { get; set; }
}
}
después de la migración de la adición Inicial realicé y cambié el código a public int Price {get; conjunto; } hizo la misma migración de datos DummyMigration y se creó en la carpeta de migración 080372472_dummyMigration
namespace IdetityBeta.Migrations
{
using System;
using System.Data.Entity.Migrations;
public partial class DummyMigration : DbMigration
{
public override void Up()
{
AlterColumn("dbo.Products", "Price", c => c.String());
}
public override void Down()
{
AlterColumn("dbo.Products", "Price", c => c.Decimal(nullable: false, precision: 18, scale: 2));
}
}
}
Entonces, la base de datos de actualización y el problema se resolvieron
Para mí, el problema era que habíamos cambiado el nombre del espacio de nombre de la migración 2014123456_Initial.cs.
Pero VS no había regenerado el espacio de nombres en su 2014123456_Initial.Designer.cs asociado.
Una vez que se modificó Designer.cs para usar el mismo espacio de nombres, todo comenzó a funcionar nuevamente.
(También publicó esto como una respuesta aquí porque ambas preguntas son muy similares)