visual update studio remove migrations initial framework force first enable code automatic entity-framework migration

update - Sin creación inicial con migraciones de Entity Framework



revert migration ef core (6)

Estoy tratando de hacer funcionar las migraciones de Entity Framework. He habilitado primero las migraciones de código, ha creado una carpeta de migraciones, un archivo de configuración y la tabla de historial de mig, pero ninguna creación inicial. ¿Me estoy perdiendo un paso? Este es un nuevo db creado por EF (4.3.1).


¡"Initial Create" NO se crea automáticamente! Necesitas crear eso tú mismo. Algunos tutoriales de EF son confusos y tuve el mismo malentendido que tú.

Qué necesitas hacer:

-Add-Migration InitialModel

Si ya ha creado sus tablas de base de datos y modelo de dominio, entonces:

-Add-Migration InitialModel -IgnoreChanges

Desde este punto, su código estará sincronizado con la base de datos. Cada vez que cambie el código, puede usar Add-Migration para agregar los cambios a su base de datos.


El artículo / tutorial aquí (en microsoft.com) describe la razón por la que no existe una migración initialCreate. La migración solo se agregará si la base de datos ya existe. De lo contrario, la primera migración será el "initialCreate" ya que no tiene sentido crear una migración a una base de datos que aún no existe ... sin DB significa que no hay nada para revertir, en una migración descendente.

Aquí está el párrafo pertinente:

Ejecute el comando Enable-Migrations en la Consola de Package Manager. Este comando ha agregado una carpeta de Migraciones a nuestro proyecto, esta nueva carpeta contiene dos archivos:

La clase de configuración. Esta clase le permite configurar cómo se comportan las Migraciones para su contexto. Para este tutorial solo usaremos la configuración predeterminada. Debido a que solo hay un único contexto de Code First en su proyecto, Enable-Migrations ha completado automáticamente el tipo de contexto al que se aplica esta configuración.

Una migración de InitialCreate . Esta migración se generó porque ya teníamos Code First, creamos una base de datos para nosotros, antes de habilitar las migraciones. El código en esta migración de andamio representa los objetos que ya se han creado en la base de datos. En nuestro caso, esa es la tabla de Blog con las columnas BlogId y Name. El nombre de archivo incluye una marca de tiempo para ayudar con el pedido.

Si la base de datos aún no se hubiera creado, esta migración de InitialCreate no se habría agregado al proyecto. En cambio, la primera vez que llamemos Add-Migration, el código para crear estas tablas se colocará en una nueva migración.


Este comportamiento no está implementado de forma predeterminada, pero está disponible para usted fácilmente en muchas formas diferentes.

  1. Puede llamar a context.Database.CreateIfNotExists(); al inicio de la aplicación.

  2. Puede utilizar uno de los DatabaseInitializer incorporados. El inicializador CreateDatabaseIfNotExists está integrado en EntityFramework y solo debe agregarse a su proyecto.

  3. Puede crear su propio inicializador de base de datos personalizado que incluye la opción # 1 dentro de sí mismo. Ejemplo: Code First Migrations e inicialización.

Puede incluir DatabaseInitializers en su proyecto ya sea por código o por medio de un archivo de configuración.

Incluya un inicializador de base de datos EntityFramework a través del código:

En el inicio de la aplicación, puede configurar el DatabaseInitializer de la siguiente manera:

System.Data.Entity.Database.SetInitializer<DairyMmmContext>(new System.Data.Entity.CreateDatabaseIfNotExists<DairyMmmContext>());

NOTA: ¡este código ha cambiado varias veces a lo largo de la vida de entidadframework! Este ejemplo es para EF 4.3, que es la versión de producción actual disponible a través de nuget.

Incluya un inicializador de base de datos EntityFramework a través del elemento de configuración:

<configuration> <entityFramework> <contexts> <context type="MyNamespace.MyEFDataContext, AssemblyName"> <databaseInitializer type="System.Data.Entity.CreateDatabaseIfNotExists`2[[MyNamespace.MyEFDataContext, AssemblyName], [MyNamespace.Migrations.Configuration, AssemblyName]], EntityFramework" /> </context> </contexts> </entityFramework> </configuration>

Notará que esto puede ser un poco "ingrato" con esta configuración. MyNamespace.MyEFDataContext reemplazar el nombre de la AssemblyName arriba con el nombre del conjunto en el que guarda las cosas de entidadframework, reemplazar MyNamespace.MyEFDataContext con el nombre completo del contexto de datos de entityframework y reemplazar MyNamespace.Migrations.Configuration con el nombre completo de su clase de configuración (De forma predeterminada en la carpeta Migración dentro de su proyecto).

EDITAR: Editado para responder a comentarios adicionales.

Una migración es un cambio de una definición de esquema a otra definición de esquema. Crear la base de datos vacía no es una migración (pero todo lo que sigue es eso). No habrá ningún archivo de origen de migración en su proyecto para solo crear una base de datos vacía, que se realiza en el código mediante el inicializador.

Si ya está utilizando el inicializador DropCreateDatabaseAlways , debería hacerlo. Sin embargo, me di cuenta de que está configurando el inicializador en el código, lo que significa que existe la posibilidad de un problema de tiempo (el establecimiento del inicializador después de que su contexto ya haya pasado el punto de llamar a cualquier inicializador).

Puede forzar que entityframework ejecute su inicializador en cualquier punto del código con context.Database.Initialize(true); (El parámetro es verdadero / falso para forzar la inicialización independientemente del estado actual). Eso dejaría caer y recrearía su base de datos cada vez.

Pero también puede asegurarse de que su inicializador esté configurado lo antes posible en el ciclo de vida de su aplicación (antes de que haya creado una instancia única de su contexto).


Estoy utilizando EF 6 RC1 y encontré este problema en el que no se crearon InitialCreate ni __MigrationHistory al ejecutar Enable-Migrations.

En realidad, justo después de actualizar de EF 5 a EF 6, ejecuté Enable-Migrations y, por algún motivo, creé una tabla __MigrationHistory utilizando el esquema de EF 5, así que lo eliminé junto con mi directorio de Migrations y traté de volver a empezar.

Pero cada vez que borraba el directorio de Migraciones no se creaba un InitialCreate o __MigrationHistory. Intenté eliminar y volver a crear la base de datos y reiniciar Visual Studio 2012 sin éxito. Me di por vencido por el día y la mañana siguiente lo intenté de nuevo, después de dejar que mi computadora permaneciera durante aproximadamente 8 horas, creó el InitialCreate. Supongo que debe haber un caché en algún lugar que tenga un tiempo de espera realmente largo, ¿alguien? También supongo que reiniciar podría borrar la memoria caché, pero no lo intenté.

En cualquier caso, es posible utilizar PM> Add-Migration InitialCreate para realizar ese paso manualmente.

De todos modos, todavía no conseguí una tabla de __MigrationHistory. Aparentemente, EF 6 ha cambiado de crearlo durante el comando Enable-Migrations a solo crearlo durante el comando Update-Database. Y dado que mi esquema ya se había creado en ese momento, tenía que arrancarlo y recrearlo manualmente:

PM> Update-Database -TargetMigration:0 PM> Update-Database

También me detuve después del primer comando para verificar el estado de la base de datos para asegurarme de que estaba actualizando la correcta, ya que de acuerdo con esto , la cadena de conexión de la base de datos se retira o se genera automáticamente según la configuración, y a menos que se configure correctamente no hay garantía de que vaya a acceder a la base de datos o la instancia de SQL Server que desea.

Después de ejecutar ambos comandos, creó una tabla __MigrationHistory - y no la creó como una tabla del sistema (que en realidad no quería), así que todo está bien. No es exactamente el mismo problema que el OP, pero espero que esto sea útil para otra persona.

Referencias:


No estoy seguro de que sea lo mismo pero tuve un problema similar. Creo que mi problema estaba relacionado con el hecho de que no uso una cadena de conexiones del archivo de configuración para obtener mi cadena de conexión.

Jugueteando con el proyecto de inicio en la solución y también con el combo de proyecto en la Consola del administrador de paquetes, pude generar esa primera migración.

También asegúrese de tener una cadena de conexiones con el nombre de su clase dbContext para que el Administrador de paquetes pueda encontrarla.


Sé que esto es antiguo, pero no hay una respuesta aceptada y tuve el mismo problema.

El truco es el comando Enable-Migrations. Como se indica here hay un comando Enable-Migrations – EnableAutomaticMigrations . Lo que hace es iniciar las migraciones exactamente donde estás.

Si desea que la primera migración sea la creación de una base de datos, simplemente ejecute Enable-Migrations (sin --EnableAutomaticMigrations).

Y recuerda configurar el inicializador:

Database.SetInitializer(new MigrateDatabaseToLatestVersion<LicenseContext, Configuration>());