¿Cómo volver a crear la base de datos para Entity Framework?


143

Me metí en un mal estado con mi proyecto ASP.Net MVC 5, usando Code-First Entity Framework. No me importa perder datos, solo quiero poder comenzar de nuevo, recrear la base de datos y comenzar a usar las migraciones de Code-First.

Actualmente estoy en un estado en el que cada intento de actualizar la base de datos da como resultado una excepción o un mensaje de error. Además, el sitio web no puede acceder a la base de datos correctamente. ¿Cómo puedo borrar todas las migraciones, volver a crear la base de datos y comenzar desde cero sin tener que crear un nuevo proyecto? En otras palabras, quiero mantener mi código pero descartar la base de datos.

Más adelante también querré sincronizar la base de datos de implementación (SQL Server en Azure). Nuevamente, no me importa descartar todos los datos, solo quiero que funcionen.

Proporcione todos los pasos para volver a un estado limpio. Muy apreciado.


TBH si simplemente quieres DROP DATABASEentonces ...
Worthy7

Respuestas:


209

Siga los pasos a continuación:

1) Primero vaya al Explorador de servidores en Visual Studio, verifique si las Conexiones de datos ".mdf" para este proyecto están conectadas, de ser así, haga clic derecho y elimine.

2) Vaya al Explorador de soluciones, haga clic en el icono Mostrar todos los archivos.

3) Vaya a App_Data, haga clic derecho y elimine todos los archivos ".mdf" para este proyecto.

4) Eliminar la carpeta Migraciones haciendo clic derecho y eliminar.

5) Vaya a SQL Server Management Studio, asegúrese de que la base de datos para este proyecto no esté allí; de lo contrario, elimínela.

6) Vaya a Package Manager Console en Visual Studio y escriba:

  1. Enable-Migrations -Force
  2. Add-Migration init
  3. Update-Database

7) Ejecute su aplicación

Nota: en el paso 6, parte 3, si obtiene un error "No se puede adjuntar el archivo ...", posiblemente sea porque no eliminó los archivos de la base de datos por completo en SQL Server.


¡Excelente! Esto funcionó, gracias! Muy útil de hecho. ¿Son similares los pasos para volver a crear la base de datos de implementación (Azure SQL)?
Toby Sharp

hola @TobySharp, no hay problemas. Si no tiene ningún dato en su base de datos, puede seguir estos pasos, pero si tiene datos, los pasos no son los mismos.
Lin

No tengo ningún dato que deba conservar.
Toby Sharp

3
Actualización, si elimina de VS (como dicen las instrucciones) y no del Explorador de Windows, entonces funciona. Además, si no tiene SQL Management Studio, puede usar Sql Object Explorer en VS para eliminarlo de un localdb.
Mike Ward

3
Si recibe el error "No se puede adjuntar el archivo ...", aunque crea que ha eliminado todo, intente la respuesta de este hilo: stackoverflow.com/questions/13275054/…
Andy

44

Me gustaría agregar que la respuesta de Lin es correcta.

Si elimina incorrectamente el MDF, tendrá que arreglarlo. Para arreglar las conexiones atornilladas en el proyecto al MDF. Respuesta corta; recrearlo y eliminarlo correctamente.

  1. Cree un nuevo MDF y asígnele el mismo nombre que el antiguo MDF, colóquelo en la misma ubicación de carpeta. Puede crear un nuevo proyecto y crear un nuevo mdf. El mdf no tiene que coincidir con sus tablas anteriores, porque lo eliminaríamos. Así que cree o copie uno antiguo en la carpeta correcta.
  2. Ábralo en el explorador del servidor [haga doble clic en el mdf del explorador de soluciones]
  3. Eliminarlo en el servidor explorador
  4. Eliminarlo del explorador de soluciones
  5. ejecutar update-database -force [Usar fuerza si es necesario]

Listo, disfruta de tu nueva base de datos

ACTUALIZACIÓN 11/12/14 - Lo uso todo el tiempo cuando hago un cambio db de última hora. Descubrí que esta es una excelente manera de revertir sus migraciones a la base de datos original:

  • Pone el db de nuevo al original
  • Ejecute la migración normal para volver a la actual.

    1. Update-Database -TargetMigration:0 -force [Esto destruirá todas las tablas y todos los datos.]
    2. Update-Database -force [use la fuerza si es necesario]

1
Me alegra mucho poder ayudar ... Voy a actualizar mi respuesta. Recientemente encontré una mejor manera de deshacer todos los cambios.
Steve Coleman

8

Esto funcionó para mí:

  1. Eliminar la base de datos del Explorador de objetos de SQL Server en Visual Studio. Haga clic derecho y seleccione eliminar.
  2. Elimine archivos mdf y ldf del sistema de archivos, si todavía están allí.
  3. Reconstruir solución.
  4. Iniciar aplicación: la base de datos se volverá a crear.

1
Sí, todo lo que tenía que hacer era eliminar el MDF, actualizar la cadena de conexión en web.config, luego ejecutar la aplicación y registrar una nueva cuenta. Creó todas las tablas nuevamente en la nueva base de datos de forma automática.
Dan Bechard

3

Si bien esta pregunta se basa en no preocuparse por los datos, a veces el mantenimiento de los datos es esencial.

Si es así, escribí una lista de pasos sobre cómo recuperarse de la pesadilla de Entity Framework cuando la base de datos ya tiene tablas con el mismo nombre aquí: Cómo recuperarse de la pesadilla de Entity Framework: la base de datos ya tiene tablas con el mismo nombre

Aparentemente ... un moderador consideró adecuado eliminar mi publicación, así que la pegaré aquí:

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

Descripción : si eres como nosotros cuando tu equipo es nuevo en EF, terminarás en un estado en el que no podrás crear una nueva base de datos local o no podrás aplicar actualizaciones a tu base de datos de producción. Desea volver a un entorno EF limpio y luego seguir con lo básico, pero no puede. Si lo hace funcionar para producción, no puede crear una base de datos local, y si lo hace funcionar para local, su servidor de producción se desincroniza. Y finalmente, no desea eliminar ningún dato del servidor de producción.

Síntoma : no se puede ejecutar Update-Database porque está intentando 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 existe un objeto llamado '' en la base de datos.

Antecedentes del problema : EF comprende dónde se encuentra la base de datos actual en comparación con dónde se encuentra el código según una tabla en la base de datos llamada dbo .__ MigrationHistory. Cuando mira las secuencias de comandos de migración, intenta reconciliar dónde estaba por última vez con las secuencias de comandos. Si no puede, solo intenta aplicarlos en orden. Esto significa que vuelve a la secuencia de comandos de creación inicial y si observa la primera parte del comando ARRIBA, será la tabla CreeateTable para la tabla en la que se produjo el error.

Para entender esto con más detalle, recomiendo ver los dos videos mencionados aquí: https://msdn.microsoft.com/en-us/library/dn481501(v=vs.113).aspx

Solución : Lo que debemos hacer es engañar a EF para que piense que la base de datos actual está actualizada sin aplicar estos comandos de CreateTable. Al mismo tiempo, todavía queremos que esos comandos existan para poder crear nuevas bases de datos locales.

Paso 1: Producción de base de datos 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 puede recuperar todo esto de git si es necesario.

Paso 3: Recreate Initial En el Administrador de paquetes, ejecuta "Enable-Migrations" (EF te pedirá que uses -ContextTypeName si tienes varios contextos). Ejecute "Add-Migration Initial -verbose". Esto creará el script inicial para crear la base de datos desde cero en función del código actual. Si tuvo alguna operación de inicialización en Configuration.cs anterior, cópielo.

Paso 4: Truco EF En este punto, si ejecutamos Update-Database , obtendríamos el error original. Por lo tanto, debemos engañar a EF para que piense que está actualizado, sin ejecutar estos comandos. Entonces, 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 échale un vistazo si quieres. Ahora, descomenta ese código y guarda. Puede ejecutar Update-Database nuevamente si desea verificar que EF cree que está actualizado. No ejecutará el paso Arriba con todos los comandos CreateTable porque cree que ya lo ha hecho.

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 "Add-Migration MissingMigrations" Esto creará prácticamente un script vacío. Debido a que el código ya estaba allí, en realidad había los comandos correctos para crear estas tablas en la secuencia de comandos de migración inicial, por lo que simplemente corté los comandos CreateTable y equivalentes en los métodos Arriba y Abajo.

Ahora, ejecute Update-Database nuevamente y observe cómo ejecuta su nuevo script de migración, creando las tablas apropiadas en la base de datos.

Paso 7: Vuelva a confirmar y confirme. Construye, prueba, corre. Asegúrese de que todo se esté ejecutando y luego confirme los cambios.

Paso 8: Informe al resto de su equipo cómo proceder. Cuando la próxima persona se actualice, EF no sabrá qué impacto dado que los scripts que había ejecutado antes no existen. Pero, suponiendo que las bases de datos locales se puedan volar y recrear, todo esto es bueno. Tendrán que soltar su base de datos local y agregar crearla desde EF nuevamente. Si tenían cambios locales y migraciones pendientes, recomendaría que vuelvan a crear su base de datos en el maestro, cambien a su rama de características y vuelvan a crear esos scripts de migración desde cero.


1

Solo quiero agregar a la excelente respuesta de @Lin:

5) B. Si no tiene SQL Management Studio, vaya al "Explorador de objetos de SQL Server". Si no puede ver la base de datos de su proyecto en el "Explorador de objetos de SQL Server" de localdb, haga clic en el botón "Agregar servidor SQL" para agregarlo a la lista manualmente. Luego puede eliminar el db de la lista.


Si desea agregar algo a una respuesta, agregue un comentario a esa respuesta en lugar de publicar una nueva respuesta.
Oliver

1
No estaba al tanto de eso. Así que ahora puede mover su respuesta a un comentario y eliminar esta respuesta, ya que técnicamente no es una respuesta (completa) a la pregunta :-)
Oliver

0

Una posible solución muy simple que funcionó para mí. Después de eliminar cualquier referencia de base de datos y conexiones que encuentre en el servidor / serverobject explorer, haga clic derecho en la carpeta App_Data (no mostró ningún objeto dentro de la aplicación para mí) y seleccione abrir. Una vez abierto poner toda la base de datos / etc. archivos en una carpeta de respaldo o si tiene las agallas simplemente elimínelos. Ejecute su aplicación y debería recrear todo desde cero.


0

Mi solución es la más adecuada para :
- eliminó su archivo mdf
- desea volver a crear su base de datos.

Para recrear su base de datos necesita agregar la conexión usando Visual Studio.

Paso 1 : vaya al Explorador de servidores para agregar una nueva conexión (o busque un ícono para agregar db).

Paso 2 : cambie el origen de datos a un archivo de base de datos de Microsoft SQL Server .

Paso 3 : agregue el nombre de la base de datos que desee en el campo Nombre del archivo de la base de datos (preferiblemente el mismo nombre que tiene en el atributo web.config AttachDbFilename )

Paso 4 : haga clic en Examinar y navegue hasta donde le gustaría que se ubique.

Paso 5 : en el comando de ejecución de la consola del administrador de paquetesupdate-database

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.