Cómo eliminar y volver a crear desde cero una base de datos de EF Code First existente

84

Estoy usando EF Code First con EF 5 en VS 2012. Utilizo el update-databasecomando PM y tengo un método de inicialización simple para llenar algunas tablas con datos de muestra.

Me gustaría eliminar y volver a crear mi x.mdb. El historial de actualizaciones parece no estar sincronizado. Si comento todos mis DBSets en mi contexto, se update-databaseejecuta sin error pero deja algunas tablas en la base de datos. Como no tengo datos valiosos en la base de datos, parece más simple restablecer todo.

¿Cómo puedo lograr esto?

g.pickardou
fuente

Respuestas:

110

Si lo entiendo bien ...

Si quieres start clean:

1) Elimine manualmente su base de datos , donde sea que esté (supongo que tiene su conexión ordenada), o vacíela, pero más fácil / más seguro es eliminarlo todo junto, ya que hay una system __MigrationHistorytabla, también debe eliminarlo.

2) Elimine todosmigration files , los que están debajo Migrations, y los números con nombres similares, etc., elimínelos todos,

3) Reconstruya su proyecto que contiene migraciones (y el resto), y asegúrese de que su proyecto esté configurado (configuración) para compilarse automáticamente (eso a veces puede causar problemas, pero probablemente no para usted),

4) Ejecutar de Add-Migration Initialnuevo, luegoUpdate-Database

NSGaga-principalmente-inactivo
fuente
6
¿Entonces no hay un comando para obtener migraciones ef para eliminar la base de datos?
cjb110
1
... hasta donde yo sé (no estoy seguro de las últimas versiones): EF / migraciones son buenas para 'crear' cuando no hay Db, y luego 'actualizar' a medida que cambia el código. Pero cuando es necesario realizar un mantenimiento administrador tiene que ensuciarse las manos
NSGaga-sobre todo-inactiva
1
También tuve que eliminar la base de datos del explorador de objetos del servidor SQL.
Steven Jeuris
Tuve que reiniciar Visual Studio antes de ejecutar Update-Database para que funcionara. En el primer intento, se produjo un error durante la generación de las nuevas estructuras, aunque la migración adicional se realizó sin problemas reportados.
Patric
2
@lpacheco Si tiene una base de datos de producción que contiene datos que no desea destruir entonces, eh, sugiero respetuosamente que una pregunta titulada "Cómo eliminar ... una base de datos ... existente" no era la pregunta correcta para usted. .
Mark Amery
60

Si trabajó de la manera correcta para crear sus migraciones usando el comando Add-Migration "Name_Of_Migration", puede hacer lo siguiente para obtener un comienzo limpio (reiniciar, con pérdida de datos, por supuesto ):

  1. Update-database -TargetMigration:0

    Normalmente, su base de datos está vacía ahora desde que se ejecutaron los métodos hacia abajo.

  2. Update-database

    Esto recreará su base de datos a su migración actual

Daf De Giraf
fuente
1
Update-database -TargetMigration: 0 necesita el indicador -f (forzar) para eliminar todo o de lo contrario dirá posible pérdida de datos. El comando debe ser: Update-database -TargetMigration: 0 -f
Tascalator
@Tascalator, solo probé esto sin -f y no hubo advertencia sobre una posible pérdida de datos. Usando EF 6.1.2, y había datos en las tablas que se eliminaron.
jk7
Respuesta perfecta. ¡Rapido y Facil! Thnx
sapatelbaps
Según EF Core Docs, el nombre correcto del parámetro es -Target (para EF Core 1.1) o -Migration (para EF Core 2.0)
Harvey Darvey
32

Revestimiento único para colocar, crear y sembrar desde la consola del administrador de paquetes:

update-database -TargetMigration:0 | update-database -force

Kaboom.

Amadeo Gallardo
fuente
5
¿Por qué sería necesario ejecutar el mismo paso dos veces? "update-database -force" quiero decir
SwissCoder
Solo un pequeño aviso: "AutomaticMigrationDataLossAllowed = true;" es necesario dentro de la configuración.
Unicco
2
La sintaxis equivalente en EF Core es solo Update-Database 0. Independientemente, esto no encaja bien en el caso del OP en el que "El historial de actualizaciones parece no estar sincronizado" ; este enfoque funciona ejecutando la migración "Down" para cada migración aplicada hasta ahora a la base de datos, por lo que si ha eliminado una migración que se aplicó anteriormente, esta fallará (y de manera similar puede fallar si ha modificado una migración después aplicándolo). La respuesta aceptada es más sólida. -1 por eso, y la repetición inexplicable de update-database -force.
Mark Amery
1
@SwissCoder: no necesita el mismo paso dos veces (al menos, no lo hice). Creo que fue un error tipográfico.
Ed Graham
1
@SwissCoder Honestamente, no me he dado cuenta, sin intención de ofender
Vima91
31

Para EntityFrameworkCore puede utilizar lo siguiente:

Update-Database -Migration 0

Esto eliminará todas las migraciones de la base de datos. Entonces puedes usar:

Remove-Migration

Para eliminar su migración. Finalmente, puede recrear su migración y aplicarla a la base de datos.

Add-Migration Initialize
Update-Database

Probado en EFCore v2.1.0

Gizmo3399
fuente
2
¡Funciona de maravilla!
pavelnieks
4

Qué tal si ..

static void Main(string[] args)
{
    Database.SetInitializer(new DropCreateDatabaseIfModelChanges<ExampleContext>());  
    // C
    // o
    // d
    // i
    // n
    // g
}

Recogí esto de Programming Entity Framework: Code First , Pg 28 First Edition.

SAm
fuente
11
Esta no es una buena ida. Lo más probable es que este código llegue a Producción y termines teniendo un gran dolor de cabeza con tus clientes ...
Amadeo Gallardo
Esto solo elimina la base de datos si el modelo cambia, OP quiere eliminarla incluso sin un cambio de modelo.
Quantic
0

Siga estos pasos:

  1. Elimine aquellos objetos que deben eliminarse del contexto // Dbset<Item> Items{get;set;} y en Nuget Console ejecute estos comandos
  2. agregar-migración [contextName]
  3. actualizar-base de datos -verbose

Se eliminarán las tablas que no existen en el contexto, pero que ya se crearon en la base de datos.

Shaahin
fuente
0

dbctx.Database.EnsureDeleted (); dbctx.Database.EnsureCreated ();

Greck
fuente
0

Permítame ayudarlo a actualizar las respuestas aquí, ya que los nuevos usuarios lo encontrarán útil. Creo que el objetivo es eliminar la base de datos y volver a crearla utilizando el enfoque EF Code First. 1. Abra su proyecto en Visual Studio usando la extensión ".sln". 2.Seleccione Explorador de servidores (a menudo se encuentra a la izquierda) 3.Seleccione Explorador de objetos de SQL Server. 4. La base de datos que desea eliminar aparecerá en cualquiera de los localDB. Haz clic derecho y selecciona eliminar.

Albert Quist
fuente
Parece que el OP estaba buscando un comando que se ejecutara en la línea de comandos, ya que mencionaron explícitamente update-database, y dado que menciona la siembra, supongo que estaban buscando una solución automatizada para realizar pruebas. Por lo tanto, su solución de interfaz de usuario probablemente no sea lo que están buscando.
valkn0t
0

Hay muchas formas de eliminar una base de datos o actualizar una base de datos existente, simplemente puede cambiar a migraciones anteriores.

dotnet ef database update previousMigraionName    

Pero algunas bases de datos tienen limitaciones como no permitir modificar después de crear relaciones, lo que significa que no ha permitido privilegios para eliminar columnas de los proveedores de bases de datos ef core, pero la mayor parte del tiempo en ef core drop database está permitido. De modo que puede eliminar DB usando el comando drop y luego vuelve a utilizar la migración anterior.

dotnet ef database drop
PMC command 
PM> drop-database

O puede eliminar manualmente la base de datos y realizar una migración.

Samithe Adhikari
fuente
-2

Dado que algún día los nuevos usuarios de EF Core harán clic en esta pregunta y encuentro que las respuestas principales son algo innecesariamente destructivas, le mostraré una manera de comenzar "de nuevo". Cuidado, esto borra todos sus datos.

  1. Elimine todas las tablas en su servidor MS SQL. También elimine la tabla __EFMigrations.
  2. Tipo dotnet ef database update
  3. EF Core ahora recreará la base de datos desde cero hasta su última migración.
mendigo
fuente