una tabla registro mvc mostrar framework first español ejemplo datos consultas actualizar entity-framework entity-framework-6 database-migration ef-migrations

entity-framework - tabla - mvc entity framework español



Cómo recuperarse de la pesadilla de Entity Framework: la base de datos ya tiene tablas con el mismo nombre (1)

Originalmente escribí esto como una pregunta de respuesta automática, ya que había luchado con el problema durante algún tiempo, al igual que algunos colegas, pero desafortunadamente mi respuesta fue eliminada y no puedo recuperarla.

Dado que es una situación que sospecho que puede ocurrir varias veces a medida que la gente trata de "limpiar" migraciones anteriores, pensé en documentarla con instrucciones paso a paso.

Descripción de la situación en la que nos encontramos : no pudimos crear una nueva base de datos local porque el script de inicio no estaba completo y no podía aplicar actualizaciones a la base de datos de producción porque los scripts de migración crean tablas que ya existen. Y, no queríamos eliminar los datos de producción.

Síntoma : no se puede ejecutar la base de datos de actualización porque está tratando de ejecutar el script de creación y la base de datos ya tiene tablas con el mismo nombre.

Mensaje de error: System.Data.SqlClient.SqlException (0x80131904): Ya hay un objeto llamado '''' en la base de datos.

Antecedentes del problema : para comprender esto con más detalle, recomendaría ver ambos videos a los que se hace referencia aquí: https://msdn.microsoft.com/en-us/library/dn481501(v=vs.113).aspx

Para resumir, EF entiende dónde se encuentra la base de datos actual en comparación con dónde está el código en función de una tabla en la base de datos denominada dbo .__ MigrationHistory. Cuando mira los Scripts de migración, intenta volver a determinar dónde estaba el último en con los scripts. Si no puede, simplemente intenta aplicarlos en orden. Esto significa que vuelve al script de creación inicial y si observa la primera parte del comando UP, será la Tabla Creeate para la tabla en la que se produjo el error.

Solución : lo que tenemos que hacer es engañar a EF para que piense que la base de datos actual está actualizada, mientras que "no" aplica estos comandos CreateTable ya que la base de datos de producción ya existe. Una vez que se establece la base de datos de producción, también necesitamos poder crear bases de datos locales.

Paso 1: DB de producción limpia Primero, haga una copia de seguridad de su producción db. En SSMS, haga clic con el botón derecho en la base de datos, seleccione "Tareas> Exportar aplicación de nivel de datos ..." y siga las instrucciones. Abra su base de datos de producción y elimine / suelte la tabla dbo .__ MigrationHistory.

Paso 2: Limpieza del entorno local Abra su carpeta de migraciones y elimínela. Supongo que puedes recuperar todo esto de Git si es necesario.

Paso 3: recrear inicial En el Administrador de paquetes, ejecute "Habilitar migraciones" (EF le pedirá que use -ContextTypeName si tiene contextos múltiples). Ejecute "Add-Migration Initial -verbose". Esto creará la secuencia de comandos inicial para crear la base de datos desde cero en función del código actual. Si tenía alguna operación de inicialización en Configuration.cs anterior, cópiela.

Paso 4: truco EF En este punto, si ejecutamos la base de datos de actualización , obtendríamos el error original. Entonces, tenemos que engañar a EF para que piense que está actualizado, sin ejecutar estos comandos. Por lo tanto, vaya al método Up en la migración inicial que acaba de crear y coméntelo todo.

Paso 5: Actualización de la base de datos Sin código para ejecutar en el proceso Up, EF creará la tabla dbo .__ MigrationHistory con la entrada correcta para decir que ejecutó este script correctamente. Ve y compruébalo si quieres. Ahora, elimine el comentario de ese código y guárdelo. Puede ejecutar Update-Database nuevamente si desea verificar que EF piense que está actualizado. No ejecutará el paso Arriba con todos los comandos de CreateTable porque cree que ya lo hizo.

Paso 6: Confirme que EF está ACTUALMENTE actualizado Si tenía un código que aún no tenía migraciones aplicadas, esto es lo que hice ...

Ejecute "Agregar Migración MissingMigrations" Esto creará prácticamente un script vacío. Debido a que el código ya estaba allí, en realidad existían los comandos correctos para crear estas tablas en el script de migración inicial, así que corté los comandos CreateTable y equivalente en los métodos Arriba y Abajo.

Ahora, ejecute Update-Database nuevamente y mire cómo ejecuta su nueva secuencia de comandos de migración, creando las tablas apropiadas en la base de datos.

Paso 7: reconfirmar y confirmar. Construye, prueba, ejecuta. Asegúrese de que todo esté funcionando y luego comprometa los cambios.

Paso 8: deja que el resto de tu equipo sepa cómo proceder. Cuando la próxima persona se actualice, EF no sabrá qué le ocurrió dado que los scripts que tenía antes no existen. Pero, suponiendo que las bases de datos locales puedan volarse y volver a crearse, todo está bien. Tendrán que soltar su base de datos local y agregar crearla de EF nuevamente. Si tuvieran cambios locales y migraciones pendientes, les recomendaría que crearan su base de datos nuevamente en el maestro, cambien a su rama de características y recreen esos scripts de migración desde cero.

¿Cómo logras que EF vuelva a sincronizarse con el código sin perder datos cuando la base de datos de actualización devuelve el siguiente mensaje

Mensaje de error: System.Data.SqlClient.SqlException (0x80131904): Ya hay un objeto llamado '''' en la base de datos.