2012-08-22 26 views
26

Estoy intentando que las migraciones de Entity Framework funcionen. He habilitado las primeras migraciones del código, se creó una carpeta de migraciones, un archivo de configuración y la tabla del historial de mig, pero no se creó inicialmente. ¿Me estoy perdiendo un paso? Este es un nuevo archivo db creado por EF (4.3.1).Sin creación inicial con migraciones de Entity Framework

+2

Después Habilitar migraciones, hay que añadir a la migración – Dabblernl

+0

qué no añadir en el inicial crear la migración de forma automática? –

+2

esto podría ayudar a http: // stackoverflow.com/questions/11679385/reset-entity-framework-migrations – detay

Respuesta

21

Este comportamiento no está establecido de manera predeterminada, pero está disponible para usted de muchas formas diferentes.

  1. Puede llamar context.Database.CreateIfNotExists(); al iniciarse la aplicación.

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

  3. Puede crear su propio inicializador de base de datos personalizado que incluya la opción # 1 en su interior. Ejemplo: Code First Migrations and initialization

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

incluir un inicializador base de datos ADO.NET Entity Framework a través de código:

En el inicio de la aplicación se puede configurar el DatabaseInitializer así:

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 ADO.NET Entity Framework ! Este ejemplo es para EF 4.3, que es la versión de producción actual disponible a través de nuget.

incluir un inicializador base de datos ADO.NET Entity Framework a través de elementos 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> 

Se dará cuenta de que esto puede ser un poco "poco elegante" con esta configuración. Debe reemplazar AssemblyName arriba con el nombre del ensamblaje donde guarda su estructura de entidad, reemplace MyNamespace.MyEFDataContext con el nombre completo de su contexto de datos de estructura de entidad y reemplace MyNamespace.Migrations.Configuration con el nombre completo en su clase de configuración (de forma predeterminada en Migración) carpeta dentro de su proyecto).

EDIT: Editado para responder a los comentarios adicionales

Una migración es un cambio de la definición de un esquema a otro esquema de definición. Crear la base de datos vacía no es una migración (pero todo después de eso). No habrá un archivo fuente de migración en su proyecto solo para crear un archivo db vacío, que el inicializador realiza en código.

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 hay una oportunidad para un problema de tiempo (configurar el 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 su base de datos todo el tiempo.

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

+0

Gracias. Ya lo tengo así que se desencadena cuando se crea mi base de datos: Database.SetInitializer (nuevo DropCreateDatabaseAlways ()); ¿No es esto lo suficientemente bueno para que EF cree el archivo de migración de creación inicial? –

+0

Además, parece que la primera creación inicial es una migración automática, no estoy seguro si es por eso que no hay scrip de migración, cuando intento volver a la base de datos inicial, revierte todas las migraciones excepto la creación inicial que es una migración automática. .¿algunas ideas? solo habilito las migraciones después de que se crea el archivo db –

+0

@ newbie_86 Me dirigí a sus comentarios revisando mi respuesta, ya que creo que otros con los mismos problemas pueden beneficiarse de esta información también. – BenSwayne

4

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

Implementando el proyecto de inicio en la solución y también el combo de proyecto en la consola del Administrador de paquetes, pude generar esa primera migración.

También haga que tenga una cadena de conexiones con el nombre de su clase dbContext para que el Administrador de paquetes pueda encontrarla.

9

El artículo/tutorial aquí here (on microsoft.com) describe el motivo por el que no existe una migración de creación inicial. La migración solo se agregará si la base de datos ya existe. De lo contrario, la primera migración será 'initialCreate', ya que no tiene sentido crear una migración a una base de datos que aún no existe ... ninguna base de datos significa que no hay nada por lo que retroceder, en una migración hacia abajo.

Aquí es el párrafo pertinente:

Ejecutar el comando Enable-migraciones en la consola de Administrador de paquetes Este comando ha añadido una carpeta 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 utilizaremos la configuración predeterminada. Dado que solo hay un único contexto Code First en su proyecto, Enable-Migrations ha rellenado 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 para crear una base de datos para nosotros, antes de que habilitáramos las migraciones. El código en esta migración con scaffolded representa los objetos que ya se han creado en la base de datos. En nuestro caso, esa es la tabla 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 no se ha creado aún, esta migración InitialCreate no se habría agregado al proyecto. En cambio, la primera vez que llamemos a Add-Migration el código para crear estas tablas se agregará a una nueva migración.

0

estoy usando EF 6 RC1 y me encontré con este problema en el que se creaban ni el InitialCreate ni __MigrationHistory cuando se ejecuta Enable-migraciones.

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 usando el esquema EF 5, así que la eliminé y mi directorio Migrations e intenté comenzar de nuevo.

Pero cada vez que eliminé el directorio de Migraciones no crearía una InitialCreate o __MigrationHistory. Traté de descartar y volver a crear la base de datos y reiniciar Visual Studio 2012 en vano. Me di por vencido por el día y la mañana siguiente intenté de nuevo: luego de dejar que mi computadora se asentara durante unas 8 horas, se creó InitialCreate.Supongo que debe haber un caché en algún lugar que tenga un tiempo de espera realmente largo, ¿alguien? También estoy adivinando que el reinicio podría borrar el 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 recibí una __MigrationHistory table. Aparentemente, EF 6 ha cambiado de crearlo durante el comando Enable-Migrations para, en cambio, crearlo solo durante el comando Update-Database. Y ya que mi esquema ya había sido creado en ese momento, tenía que tirarla abajo y volver a crear manualmente:

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

También dejé después del primer comando para comprobar el estado de la base de datos para asegurarse de que estaba actualizando el correcto, desde according to this, la cadena de conexión de la base de datos se selecciona o autogenera dependiendo de la configuración, y a menos que esté configurada correctamente, no hay garantía de que vaya a acceder a la base de datos o instancia de SQL Server que desee.

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

Referencias:

16

inicial "Crear" no se crea automáticamente! Necesita crearlo usted mismo. Algunos tutoriales de EF son confusos y tuve el mismo malentendido que tú.

Lo que hay que hacer:

-Add-Migration InitialModel 

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

-Add-Migration InitialModel -IgnoreChanges 

A partir de este punto, su código será sincronizado con la base de datos . Cada vez que cambie el código, puede usar Agregar migración para agregar los cambios a su base de datos.

+0

Esto resolvió el problema para mí. –

+0

Definitivamente la solución más fácil para alguien con una base de datos existente. – JRadness

0

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

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

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

Y recuerda que para establecer inicializador:

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