No se puede generar una migración explícita en el marco de la entidad.

96

Estoy agregando una nueva migración, pero este mensaje muestra:

No se puede generar una migración explícita porque las siguientes migraciones explícitas están pendientes: [201203170856167_left]. Aplique las migraciones explícitas pendientes antes de intentar generar una nueva migración explícita.

¿Alguien puede ayudarme?

Noman Saeed
fuente
11
Esto me sucedió cuando accidentalmente cambié mi proyecto de inicio a uno diferente. Es posible que usted (u otras personas que lean esto) quieran comprobarlo rápidamente antes de intentar solucionar problemas con más profundidad (especialmente aquellos en los que tiene que empezar a eliminar migraciones y demás).
NicholasFolk
Hay una clase de migración en el directorio Migraciones que no se actualiza en el _MigrationHistory de la base de datos. Eliminar esa clase para tener el mismo estado tanto en el directorio de migración como en la base de datos resolvió mi problema.
Aryan Firouzian
1
Esto me pasa al azar. Cuando sucede, muestra que todas mis migraciones deben aplicarse. Tengo que reiniciar Visual Studio para que funcione porque ya tengo todo configurado correctamente.
Larry Flewwelling

Respuestas:

81

Le indica que hay una migración sin procesar en su aplicación y que debe ejecutarse Update-Databaseantes de que pueda agregar otra migración.

Ladislav Mrnka
fuente
12
¿Qué quieres recrear una migración inicial? ¿Esto te impide hacerlo?
Rebecca
No funcionó para mí, Update-Database solo me dio otro error. Primero tuve que eliminar los archivos pendientes.
Vahx
1
La respuesta de Thomas fue útil para mi caso similar.
Tarek Shawadfy
2
Puede ser necesario declarar un proyecto de inicio-StartupProject ContentHub.Database
osanger
2
Update-Databaseda> No se puede actualizar la base de datos para que coincida con el modelo actual porque hay cambios pendientes
ASpirina
53

Yo tuve el mismo problema. Aparentemente, el marco de la entidad genera este error cuando no puede conectarse a la base de datos. Por lo tanto, asegúrese de poder acceder a él antes de buscar otros problemas.

Robin Dorbell
fuente
1
También agregaría que este sería el caso cuando mueva su App.config a otro proyecto o si simplemente falta en su proyecto o si está en su proyecto pero está configurado incorrectamente.
Code Maverick
Recibí este mismo error después de que mi IP cambió (sucedió después de cambiar de ubicación y después de un cambio de dyn dns). Esto provocó que el firewall en la base de datos de Azure que estamos usando revocara el inicio de sesión. Lamentablemente, las migraciones de EF dan el error anterior en lugar de "no se pudo iniciar sesión" ...
Victor
8
Otro punto que me gustaría hacer es asegurarme de verificar que su proyecto de inicio sea uno con la cadena de conexión de su contexto de base de datos. Tuve este problema cuando cambié temporalmente mi proyecto de inicio y no me di cuenta de que el otro proyecto no tenía la misma cadena de conexión.
Gage Trader
Agregando a @GageTrader: tenía varios proyectos de inicio, uno sin configuración, y un proyecto web con EF-config. el proyecto (Repositorio) con migraciones tiene la misma configuración de EF en su app.config que el proyecto web. pero incluso cuando seleccioné el proyecto del repositorio como proyecto de inicio, no funcionó, pero cuando configuré el proyecto web para que se iniciara, funcionó.
JimiSweden
Tuve que indicar explícitamente el parámetro -ConnectionString, que funcionó para mí
Brian Colavito
34

Debe ejecutar "update-database" desde la consola del administrador de paquetes para enviar sus cambios a la base de datos O puede eliminar el archivo de migración pendiente ([201203170856167_left]) de su carpeta Migrations y luego volver a ejecutar "add-migration" en cree una nueva migración basada en sus ediciones.

hombre de enchufe
fuente
1
Eliminé el archivo de migración y ejecuté add-migration, pero todavía da el mismo error.
nu everest
2
Gracias, el consejo sobre la eliminación del archivo de migración pendiente fue un salvavidas
Manish
31

Este error también puede significar que las migraciones ya no se reconocen. Esto me sucedió después de haber cambiado el valor de ContextKey en Migrations.Configuration. La solución fue simplemente actualizar el ContextKey en la tabla de la base de datos "__MigrationHistory" (o revertir el valor en la clase de configuración, supongo). La clave de contexto y el espacio de nombres de su aplicación deben coincidir.

Thomas
fuente
1
Esa fue la respuesta correcta para mi caso. Como usé uno de mis proyectos anteriores para un nuevo proyecto similar, no pude realizar cambios en la base de datos sobre las migraciones anteriores. Como sugirió Thomas, el espacio de nombres era diferente en las migraciones de la clave de contexto en la tabla _MigrationsHistory, lo que provocó que las migraciones antiguas no se reconocieran.
Tarek Shawadfy
1
Esto me ayudó porque causé el problema al cambiar el nombre de la solución. En el proceso, había cambiado el nombre de ContextKey para que ya no coincidiera con las entradas de _MigrationHistory.
Joel
También funcionó para mí, establecí una clave de contexto explícita en la configuración, la cambié en __MigrationHistory y la base de datos de actualización decidió que todo estaba bien. ¡Gracias!
James White
2
Ridículo, pero está bien. Si actualizó el nombre del proyecto, o si divide su proyecto (mi caso) en pocos y está intentando agregar una nueva migración de un nuevo proyecto a la misma base de datos, debe usar la ContextKey correcta, puede configurarla en el constructor de configuración ( debe usar la clave de contexto que tiene en la tabla __MigrationHistory en la base de datos de destino)
BotanMan
Lo mismo aquí, cambié el nombre de mi espacio de nombre predeterminado y lo reemplacé en toda mi solución que causó este problema
WtFudgE
18

1. Cadena de conexión / Permisos de conexión

Vuelva a comprobar la cadena de conexión.

Asegúrese de que el usuario con el que se está conectando todavía tenga permiso para leer [__MigrationHistory]y tenga permiso para editar el esquema.

También puede intentar cambiar la cadena de conexión en la aplicación o el archivo de configuración web para usar Seguridad integrada (Windows Auth) para ejecutar el comando add-migration como usted mismo .

Por ejemplo:

connectionString="data source=server;initial catalog=db;persist security info=True;Integrated Security=SSPI;" 

Esta cadena de conexión iría en el archivo App.config del proyecto donde se encuentra DbContext.

2. Proyecto de inicio

Puede especificar el proyecto de inicio en la línea de comando o puede hacer clic con el botón derecho en el proyecto con la carpeta DbContext, Configurationy Migraciones y seleccionar Establecer como proyecto de inicio . Lo digo en serio, esto realmente puede ayudar.

ingrese la descripción de la imagen aquí

Encadenar
fuente
Jaja. Ojalá esto consiguiera más votos positivos. ¡Esto me pasa mucho y la Integrated Securitysolución funciona muy bien!
Jess
1
Tuve el mismo problema, ninguno de los comandos de migración funcionó. Resulta que no configurar el proyecto de inicio fue el culpable. Configurar eso solucionó mi problema.
Vishal
¡Cambiar el proyecto de inicio funcionó para mí! Estaba seguro de que no funcionaría, pero lo intenté de todos modos ya que todo lo demás falló. Gran respuesta.
Sylvain Rodrigue
"Establecer como inicio": ¡ nunca lo hubiera adivinado! ¡¡Gracias!!
Jasel
1
Sí, cambié intencionalmente el proyecto de inicio y olvidé volver a cambiarlo. Y es curioso que una migración anterior se realizó con un proyecto de inicio adecuado, por lo que todo funcionó bien. Pero esto es lógico ahora: b / c EF toma la cadena de conexión del proyecto, por lo que "no sabe" que las migraciones ya se aplicaron a DB ...
kosist
8

Tuve el mismo problema y pude resolverlo con algunas sugerencias de las respuestas anteriores:

  • En la consola del administrador de paquetes, verifique el proyecto predeterminado (señale el proyecto con la configuración de migración
  • Asegúrese de que startup-proj tenga un web.config con una cadena de conexión válida (o
  • Asegúrese de que el proyecto con migraciones tenga una aplicación.config / web.config con una cadena de conexión válida
  • Verifique los permisos en la base de datos (para el usuario configurado en su cadena de conexión)

Utilice "update-database -verbose" en la consola del administrador de paquetes para obtener información más específica a la que intentan conectarse las migraciones. (Ayudó en mi caso a descubrir que mi proyecto de inicio no estaba configurado correctamente ...)

flexionar
fuente
2
ejecuté "update-database -verbose" y noté que mi cadena de conexión estaba rota, lol. Entonces, el comando add-migration da el mensaje incorrecto.
Wachburn
4
"Asegúrese de que startup-proj {...}" resolvió mi problema. Gracias @flex
Andy Schmitt
7

Cuando se encuentre con este problema, intente agregar parámetros a su cmdlet add-migration. Por ejemplo, especificar el proyecto de inicio así como el nombre de la cadena de conexión podría ayudar a EF a encontrar su base de datos de destino.

add-migration Delta_Defect_0973 -ConfigurationTypeName your.namespace.ContextClassName -StartUpProject DeltaProject -ConnectionStringName DeltaSQL

Dónde:

Delta_Defect_0973 es el nombre de su migración

your.namespace.ContextClassName es el nombre de su clase de configuración en su carpeta de migración, con el prefijo del espacio de nombre completo.

DeltaProject es el nombre de su proyecto principal con su archivo web.config o app.config.

DeltaSQL es el nombre de su cadena de conexión definida en su archivo web.config o app.config.

Yves Rochon
fuente
Gracias. Esto realmente me ayudó.
Jess
Además, si está utilizando la inyección de dependencias en su solución, es posible que deba seleccionar un Proyecto predeterminado diferente en la Consola del Administrador de paquetes. Si EF no puede ubicar sus migraciones, intente seleccionar el proyecto que realmente contiene las migraciones como proyecto predeterminado.
Yves Rochon
5

Este error significa que hay migraciones pendientes que deben confirmarse antes de poder ejecutar otra migración explícita. Puedes elegir

  1. Ejecute las migraciones pendientes usando el comando Update-Database
  2. Elimina las migraciones pendientes. La forma más segura es abrir la carpeta Migraciones, haga clic derecho en [201203170856167_left]> Excluir del proyecto

Después de este, puede iniciar "Add-Migration ..." nuevamente

Espero eso ayude

Hung Vu
fuente
4

Solo mis dos centavos:

Mi escenario:

  1. Restauré mi base de datos local a un estado funcional.
  2. Ya se le habían aplicado migraciones.
  3. Cada vez que intenté agregar una nueva migración, recibí el error sobre migraciones pendientes como se mencionó en el OP.

Solución:

Para evitar esto, solo proporcioné parámetros más explícitos:

Add-Migration -ConnectionString "Server=localhost\SQLEXPRESS;Database=YourDataBase;Trusted_Connection=True;" -ConnectionProviderName "System.Data.SqlClient" -verbose

Me hacen creer que puede establecer una configuración en su carpeta app.config para permitirle establecer este comportamiento de forma predeterminada para que no tenga que proporcionar parámetros explícitos cada vez. Sin embargo, no estoy seguro de cómo hacer esto.

IbrarMumtaz
fuente
1
Esto funcionó para mí, acabo de agregar el nombre de la migración al final del comando que se muestra arriba.
sfors dice reinstalar a Monica
1
=) - Me alegro de haber podido ayudar.
IbrarMumtaz
1
-ConnectionStringNamees una alternativa a esto, y
extraerá
1
Esto me ayudó porque no estoy almacenando la cadena de conexión en el archivo de configuración
Sasinosoft
3

Hay una ambigüedad y, por tanto, un error. La mejor manera es excluir el archivo de migración actual y crear un nuevo archivo de migración ( agregar-migración ) y luego copiar el contenido de la nueva migración al archivo excluido e incluirlo nuevamente y ejecutar el comando update-database .

Sachin Cholkar
fuente
Simplemente ejecuté el update-databasecomando, luego volví a intentarlo add-migrationy funcionó
Smitty-Werben-Jager-Manjenson
3

Resolví el mismo problema como este:

  • eliminar el archivo de migración antiguo
  • actualizar-base de datos-fuerza
  • Add-Migration AddedEntity
  • actualizar base de datos
yilmazdincsoy
fuente
1

Tuve los mismos problemas y solo pude resolverlo ejecutando Add-Migration 'MigrationName' -Force

Con -Force siendo la parte importante.

Evan Barke
fuente
1

Mi base de datos local no tenía el __MigrationHistoryarchivo. Creé manualmente la tabla y luego migré los datos en esa tabla de PROD a mi base de datos local. Esto hizo que VS pensara que se habían aplicado las migraciones (que sí).

contactmatt
fuente
Tuve el mismo problema, fusioné mi base de datos en vivo en producción pero, por lo tanto, se perdió el historial de migración.
matthy
1

Consejo: siempre es bueno usar el -Scriptconmutador para los comandos de migración si no está seguro. También ayuda mucho a comprender quéUpdate-Database realmente hace.

Ejecuto lo siguiente para actualizar la base de datos, luego obtengo un script que puedo aplicar manualmente (o simplemente ejecutarlo de nuevo sin la etiqueta -Script).

Porque Update-Databaseejecutaría lo siguiente:

Update-Database -Script -ConfigurationTypeName Configuration_ASPNETIdentity -ConnectionStringName SQL_AzureLive

¿Dónde SQL_AzureLiveestá la cadena de conexión nombrada en mi configuración?

Luego puedo verificar que SQL se vea bien, aplicarlo y listo. Como muchos otros han dicho, si la cadena de conexión es incorrecta o no es válida, obtendrá este error.

Simon_Weaver
fuente
1

Para mí, eliminé el archivo de migración (en su caso, "201203170856167_left") de la Migrationscarpeta y luego ejecuté el siguiente comando en la consola del Administrador de paquetes

Add-Migration <Parameter>
Update-Database
Surendra Mourya
fuente
0

Guión

  • Estoy trabajando en una sucursal en la que creé una nueva migración de base de datos.
  • Estoy listo para actualizar desde el maestro, pero el maestro también tiene una migración de base de datos reciente.
  • Elimino la migración de la base de datos de mi sucursal para evitar conflictos.
  • Yo "actualizo desde el maestro".

Problema

Después de actualizar desde el maestro, ejecuto "Add-Migration my_migration_name", pero obtengo el siguiente error:

No se puede generar una migración explícita porque las siguientes migraciones explícitas están pendientes: [201607181944091_AddExternalEmailActivity]. Aplique las migraciones explícitas pendientes antes de intentar generar una nueva migración explícita.

Entonces, ejecuto "Update-Database" y obtengo el siguiente error:

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

Solución

En este punto, volver a ejecutar "Add-Migration my_migration_name" resolvió mi problema. Mi teoría es que ejecutar "Update-Database" tiene todo en el estado necesario para que funcione "Add-Migration".

Tod Birdsall
fuente
0

También me encontré con este problema. Llegó cuando creé una nueva base de datos y tenía cambios pendientes para mi migración de base de datos de código primero y luego intenté ejecutar el comando "Actualizar base de datos". Solución: Ejecute el comando "Add-Migration -MigrationName" para crear una nueva migración para una nueva base de datos. Luego ejecute el comando "Update-Database".

Pritam
fuente
0

También tuve este problema para una base de datos que sabía que estaba actualizada al ejecutar Add-Migration. Resuelto simplemente ejecutando el comando Add-Migration por segunda vez. Sospeche de un problema de conectividad, como sugirió Robin Dorbell anteriormente.

spadelives
fuente
En mi escenario, el nombre de la base de datos distingue entre mayúsculas y minúsculas al ejecutar el comando. tan pronto como hizo que la
cadena de
0

Eso sucedió cuando de repente cambié el nombre de una clase de migración antigua que ya existe en db. Revisé el historial de VCS, lo determiné y le cambié el nombre. Todo funcionó después.

Doctor codificador
fuente
0

Hice de otra manera. Eliminé la base de datos por completo y ejecuté "update-database" nuevamente en vs.

Ghadir Farzaneh
fuente
Esto no proporciona una solución viable; la migración válida conserva la estructura existente.
Ferdipux
0

Tuve un problema más simple. VS informó erróneamente este error cuando tenía una conexión VPN al sitio de un cliente conectado en mi estación de trabajo. El problema era que la seguridad del DBMS estaba configurada para aceptar solicitudes solo de mi IP local real. Simplemente apagando la VPN resolvió el problema.

spadelives
fuente
0

En mi caso, olvidé agregar mi dirección IP en las reglas de firewall en Azure, básicamente como no pude conectarme a la base de datos, recibí este error. Entonces, específicamente para mi caso, agregué mi dirección IP en las reglas de firewall de la base de datos en Azure y todo funcionó bien. Aparte de esto, podría ser el problema de proxy / conexión a Internet / contraseña de nombre de usuario de base de datos / cadena de conexión de base de datos, etc. O, obviamente, es posible que tenga migraciones pendientes para las que necesite ejecutar el comando Update-Database.

Siddharth Sachdeva
fuente
0

Históricamente, siempre resolví esto eliminando las migraciones pendientes, o si solo quedaba 1 y era principalmente deseable, usando -f para recrearlo.

Recientemente, esto ha dejado de funcionar para mí.

Cuando esto sucedió por primera vez, reinicié Visual Studio y luego me dejó continuar.

La segunda vez, solo funcionó después de ejecutar una limpieza en el proyecto. Era casi como si las migraciones pendientes se mantuvieran a pesar de eliminar todos los archivos del explorador.

Adam Marshall
fuente
0

Esta no será la respuesta para muchas personas, pero EF arrojará este error cuando no pueda conectarse a la base de datos. Si trabaja desde casa como yo, ¡asegúrese de estar conectado a su VPN!

CodificaciónCretin
fuente
-1

Sufrí exactamente el mismo problema justo después de revertir de una migración a otra.

En mi caso, hice una "migración dirigida" de "migración06" a "migración04".

Necesitaba eliminar la "migración0" 6 y luego pude forzar la creación de la "migración05". Esto básicamente significa que solo necesita mantener la siguiente migración después de la objetivo.

Gonzo345
fuente
-1

En mi caso (usando MS Visual Studio), fue tan simple como reiniciar Visual Studio.

AGuyCalledGerald
fuente