Restablecer migraciones de Entity-Framework

299

Eliminé mis migraciones, utilicé IgnoreChangesen la migración inicial, pero ahora quiero eliminar todas mis migraciones y comenzar con una migración inicial con toda la lógica.

Cuando elimino las migraciones en la carpeta e intento y Add-Migrationno genera un archivo completo (está vacío, porque no he realizado ningún cambio desde mi última, pero ahora eliminé, la migración).

¿Hay algún comando Disable-Migrations para poder volver a ejecutarlo Enable-Migrations?

Todd
fuente
3
Una nota importante si tiene varias cadenas de conexión: especifique cuál usar cuando restablezca las migraciones, de lo contrario, intentará aplicar a ambas, lo que puede causar problemas cuando hay discrepancias.
Jeroen Vannevel
Nota: Si no hubiera eliminado sus migraciones (¿utiliza el control de versiones, verdad?), Podría haber actualizado su base de datos, primero migró y luego eliminó la mitigación y creó nuevas migraciones desde ese punto. Ver aquí: stackoverflow.com/a/23793384/309634
DarcyThomas

Respuestas:

446

Necesitas :

  1. Eliminar el estado: elimine la carpeta de migraciones en su proyecto; Y
  2. Elimine la __MigrationHistorytabla en su base de datos (puede estar debajo de las tablas del sistema); Luego
  3. Ejecute el siguiente comando en la consola de Package Manager:

    Enable-Migrations -EnableAutomaticMigrations -Force

    Usar con o sin -EnableAutomaticMigrations

  4. Y finalmente, puedes ejecutar:

    Add-Migration Initial
Todd
fuente
55
^^ Lo descubrí, fue un error de TFS, si estás usando TFS debes realizar un check-in antes de ejecutar el comando "Enable-Migrations ...". : D
BrainSlugs83
77
Si no está utilizando el control de versiones, guarde sus valores de Semilla antes de eliminarlos.
RyanJMcGowan
77
@RyanJMcGowan si no estás usando el control de versiones, mereces perder tu trabajo. :-)
Mike Cole
44
@Tood. +1 a eso. Me ahorro mucho tiempo. Ahora, si solo el equipo de EF pudiera incorporar todo eso en un comando Reset-Migrations. Quizás EF 6 ...
Gerald Davis
24
Para una base de datos existente, debe comentar el contenido de la función "Arriba". De lo contrario, recibirá un error cuando ejecute "Update-Database", se quejaría de que la tabla ya existe
Guy
149

El problema: ha arruinado sus migraciones y desea restablecerlo sin eliminar sus tablas existentes.

El problema: no puede restablecer las migraciones con tablas existentes en la base de datos, ya que EF desea crear las tablas desde cero.

Qué hacer:

  1. Elimine las migraciones existentes de la tabla Migrations_History.

  2. Elimine las migraciones existentes de la carpeta Migraciones.

  3. Ejecute el reinicio de agregar migración. Esto creará una migración en su carpeta de Migración que incluye la creación de tablas (pero no la ejecutará, por lo que no generará errores).

  4. Ahora debe crear la fila inicial en la tabla MigrationHistory para que EF tenga una instantánea del estado actual. EF lo hará si aplica una migración. Sin embargo, no puede aplicar la migración que acaba de hacer ya que las tablas ya existen en su base de datos. Entra en la migración y comenta todo el código dentro del método "Arriba".

  5. Ahora ejecute update-database. Aplicará la migración (sin cambiar la base de datos) y creará una fila de instantáneas en MigrationHistory.

Ahora ha restablecido sus migraciones y puede continuar con las migraciones normales.

Greg Gum
fuente
11
Esta es la única respuesta que funcionó para mí. La respuesta aceptada no parece abordar el problema de lo que sucede cuando ejecuta Update-Database o ejecuta su aplicación (dependiendo del tipo de inicializador que esté utilizando). Intentará ejecutar la migración e intentará realizar cambios que ya existen. A menos que me falte algo.
regularmike
2
También es la respuesta más flexible. En mi caso, hubo algunos cambios que necesitaba aplicar y otros no. Podría mantener las cosas útiles en mi Up ().
tec-goblin
1
@ H.Johnson, lo he mirado. ¿Tienes una pregunta al respecto?
Greg Gum
2
Una cosa a tener en cuenta, desde EF 6.0, la tabla _MigrationsHistory contiene migraciones para múltiples DBContexts. Eliminarlo puede causar problemas, solo debe eliminar las filas donde ContextKey = su nombre de migración. También después del 2 anterior tuve que habilitar las migraciones nuevamente
David Waterworth
2
Esencialmente la misma respuesta, con un ejemplo ampliado (con capturas de pantalla): weblog.west-wind.com/posts/2016/Jan/13/…
nmit026
30

Qué tal si

Update-Database TargetMigration: $InitialDatabase

en la consola de Package Manager? Debería restablecer todas las actualizaciones a su estado inicial.

Enlace de referencia: Migraciones de Code First - Migración a una versión específica (incluida la degradación)

Chris Voon
fuente
Creo que mi principal frustración ya no era confiar en las migraciones para mantener el estado con precisión. Y como resultado con ganas de empezar desde cero.
Todd
@Todd, me tropecé y no siempre estaba claro si debía eliminar los archivos de migración para comenzar de nuevo. Ahora está funcionando lo siguiente: 1. volver a la inicial utilizando el comando "Update-Database –TargetMigration: $ InitialDatabase". 2. Elimine todos los archivos de migración (nombrados usando aaaamMMddHHmmssx_Name.cs o .vb) 3. Actualice la actualización utilizando 'add-Migration -Name some_name'. 4. Emita la actualización para afectar su base de datos usando 'update-Database'. Espero que funcione para ti.
Chris Voon
En mi caso, el comando sugerido en esta respuesta resultó en errores de SQL.
Justin Skiles
¿Qué debería significar "InitialDatabase"? ¿eliminará las tablas o columnas ya creadas en la base de datos?
Serge
16

Para solucionar esto, debe:

  1. Elimine todos los archivos * .cs en la carpeta Migraciones.

  2. Eliminar la tabla _MigrationHistory en la base de datos

  3. correr Enable-Migrations -EnableAutomaticMigrations -Force

  4. correr Add-Migration Reset

Luego, en la public partial class Reset : DbMigrationclase, debe comentar todas las tablas existentes y actuales:

public override void Up()
{
// CreateTable(
// "dbo.<EXISTING TABLE NAME IN DATABASE>
// ...
// }
...
}

Si se pierde este bit, todo fallará y tendrá que comenzar de nuevo.

  1. Ahora corre Update-Database -verbose

Esto debería ser exitoso si ha hecho lo anterior correctamente y ahora puede continuar con normalidad.

clavo oxidado
fuente
2
En lugar de comentar todo, también puede escribir "return"; en la primera línea del método Up ().
chainstair
6

Teniendo en cuenta que esto todavía aparece cuando buscamos EF en .NET Core, publicaré mi respuesta aquí (ya que me ha perseguido mucho). Tenga en cuenta que hay algunas sutilezas con la versión EF 6 .NET (Sin comando inicial, y deberá eliminar los archivos "Instantáneas")

(Probado en .NET Core 2.1)

Aquí están los pasos:

  1. Eliminar la _efmigrationhistorytabla.
  2. Busque su solución completa para los archivos que contienen Instantáneas en su nombre, como ApplicationDbContextSnapshot.csy elimínelos .
  3. Reconstruye tu solución
  4. correr Add-Migration InitialMigration

Nota: debe eliminar TODOS los archivos de instantáneas . Pasé innumerables horas simplemente eliminando la base de datos ... Esto generará una migración vacía si no lo hace.

Además, en el n. ° 3 solo puede nombrar su migración como desee.

Aquí hay algunos recursos adicionales: asp.net CORE Migraciones generadas vacías

Restablecer migraciones de Entity Framework 7

Jose A
fuente
3

En EntityFramework 6, intente:

Add-Migration Initial

para actualizar el archivo de migración inicial.

Asaf
fuente
3

En Entity Framework Core.

  1. Eliminar todos los archivos de la carpeta de migraciones.
  2. Escriba en la consola

dotnet ef base de datos drop -f -v

las migraciones de dotnet ef agregan Initial

actualización de la base de datos de dotnet ef

Liam Kernighan
fuente
2

Resultó que mi problema fue que eliminé manualmente la carpeta Migraciones. Lo hice porque quería hacer una copia de seguridad del contenido, así que simplemente arrastré la carpeta fuera del proyecto. Luego solucioné el problema volviéndolo a colocar (después de hacer una copia de seguridad), luego eliminé la carpeta Migraciones haciendo clic derecho en el Explorador de soluciones y seleccionando Eliminar en el menú emergente.

John Deighan
fuente
1

En EF6

  1. Elimine todos sus archivos en la carpeta 'migraciones' ... Pero no la 'creación inicial' o 'config'.
  2. Eliminar la base de datos.
  3. Ahora corre Add-Migration Initial.
  4. Ahora puede 'actualizar la base de datos' y todo estará bien.
adudley
fuente
1

Eliminar la Migrationscarpeta, Cleanluego Rebuildel proyecto. Esto funcionó para mí. Antes de limpiar y reconstruir, decía que la migración ya existe, ya que en su memoria en caché, aún no se ha eliminado.

Asedio21x
fuente
0

Este método no requiere la eliminación de la __MigrationHistorytabla, por lo que no tiene que poner las manos en la base de datos durante la implementación.

  1. Elimine las migraciones existentes de la carpeta Migraciones.
  2. En Package Manager Console ejecute Add-Migration ResetMigrations
  3. Limpie el historial de migración en el Up()método:
/// <summary>
/// Reset existing migrations by cleaning the __MigrationHistory table
/// and creating a new initial migration with the current model snapshot.
/// </summary>
public partial class ResetMigrations : DbMigration
{
    public override void Up()
    {
        Sql("DELETE FROM [dbo].[__MigrationHistory]");
    }

    public override void Down()
    {
    }
}
Olexander Ivanitskyi
fuente
0

En Net Core 3.0:

No pude encontrar una manera de restablecer las migraciones .

También tuve problemas con migraciones interrumpidas, y las respuestas proporcionadas aquí no funcionaron para mí. Tengo una API web .Net Core 3.0, y en algún momento del último mes edité la base de datos directamente. Sí, hice algo malo, malo.

Las estrategias sugeridas aquí dieron como resultado una serie de errores en Package Manager Console:

  • Ya existe una migración de ese nombre
  • No se pudo encontrar la instantánea.
  • 'Fuerza' no es un parámetro reconocido

De acuerdo, es posible que me haya perdido un paso o que haya borrado la limpieza de los archivos correctos, pero descubrí que hay formas de limpiar esto sin tanta fuerza bruta:

  • Remove-Migration del PMC para cada migración por nombre, en orden inverso de creación, hasta e incluyendo la migración interrumpida
  • Add-Migration para crear una nueva migración que será el delta entre la última buena migración hasta el esquema actual

Ahora, cuando la API web se inicia con una base de datos vacía, crea correctamente todas las tablas y propiedades para que coincidan con los modelos de entidad.

HTH!

greenCodeMonkey
fuente
0

ACTUALIZACIÓN 2020

Add-Migration Initial -Context ApplicationDbContext

ApplicationDbContext => Su contexto.

Diego Venâncio
fuente
-3
Enable-Migrations -EnableAutomaticMigrations -Force
Debendra Dash
fuente