¿Cómo habilito las migraciones de Entity Framework 5 (versión 5.0.0) para múltiples contextos de base de datos en el mismo proyecto, donde cada contexto corresponde a su propia base de datos? Cuando ejecuto Enable-Migrations
en la consola de PM (Visual Studio 2012), hay un error debido a que existen múltiples contextos:
PM> Enable-Migrations
More than one context type was found in the assembly 'DatabaseService'.
To enable migrations for DatabaseService.Models.Product1DbContext, use Enable-Migrations -ContextTypeName DatabaseService.Models.Product1DbContext.
To enable migrations for DatabaseService.Models.Product2DbContext, use Enable-Migrations -ContextTypeName DatabaseService.Models.Product2DbContext.
Si ejecuto, Enable-Migrations -ContextTypeName DatabaseService.Models.Product1DbContext
no puedo ejecutar Enable-Migrations -ContextTypeName DatabaseService.Models.Product2DbContext
porque ya existe una migración:Migrations have already been enabled in project 'DatabaseService'. To overwrite the existing migrations configuration, use the -Force parameter.
Respuestas:
La segunda llamada a Enable-Migrations falla porque el archivo Configuration.cs ya existe. Si cambia el nombre de esa clase y archivo, debería poder ejecutar ese segundo Enable-Migrations, que creará otro Configuration.cs.
Luego deberá especificar qué configuración desea utilizar al actualizar las bases de datos.
fuente
Además de lo que sugirió @ckal, es fundamental darle a cada Configuration.cs renombrado su propio espacio de nombres. Si no lo hace, EF intentará aplicar las migraciones al contexto incorrecto.
Estos son los pasos específicos que funcionan bien para mí.
Si las migraciones están en mal estado y desea crear una nueva "línea de base":
Creando la migración inicial:
En la consola del Administrador de paquetes:
En el Explorador de soluciones: cambie el nombre de Migrations.Configuration.cs a Migrations.ConfigurationA.cs. Esto debería cambiar automáticamente el nombre del constructor si usa Visual Studio. Asegúrate de que así sea. Editar ConfigurationA.cs: cambie el espacio de nombres a NamespaceOfContext.Migrations.MigrationsA
En el Explorador de soluciones: cambie el nombre de Migrations.Configuration.cs a Migrations.ConfigurationB.cs. Nuevamente, asegúrese de que el nombre del constructor también sea apropiado. Editar ConfigurationB.cs: cambie el espacio de nombres a NamespaceOfContext.Migrations.MigrationsB
Pasos para crear scripts de migración en Package Manager Console:
Ejecutar comando
o -
Está bien volver a ejecutar este comando hasta que se apliquen los cambios a la base de datos.
Ejecute los scripts en la base de datos local deseada o ejecute Update-Database sin -Script para aplicar localmente:
o -
fuente
Me encontré con el mismo problema y utilicé la siguiente solución (todo desde la Consola del Administrador de paquetes)
Esto creará 2 carpetas separadas en la carpeta Migraciones. Cada uno contendrá el
Configuration.cs
archivo generado . Desafortunadamente, aún debe cambiar el nombre de esosConfiguration.cs
archivos, de lo contrario, habrá quejas por tener dos de ellos. Cambié el nombre de mis archivos aConfigA.cs
yConfigB.cs
EDITAR : (cortesía de Kevin McPheat) Recuerde al cambiar el nombre de los archivos Configuration.cs, también cambie el nombre de los nombres de clase y los constructores / EDITAR
Con esta estructura puedes simplemente hacer
Que creará los archivos de código para la migración dentro de la carpeta junto a los archivos de configuración (esto es bueno para mantener esos archivos juntos)
Y por último, pero no menos importante, esos dos comandos aplicarán las migraciones correctas a sus bases de datos correspondientes.
EDITAR 08 de febrero de 2016: He hecho algunas pruebas con EF7 versión 7.0.0-rc1-16348
No pude hacer funcionar la opción -o | --outputDir. Siguió dando
Microsoft.Dnx.Runtime.Common.Commandline.CommandParsingException: Unrecognized command or argument
Sin embargo, parece que la primera vez que se agrega una migración, se agrega a la carpeta Migraciones, y una migración posterior para otro contexto se coloca automáticamente en una subcarpeta de migraciones.
Los nombres originales
ContextA
parecen violar algunas convenciones de nomenclatura, por lo que ahora usoContextAContext
yContextBContext
. Usando estos nombres, podría usar los siguientes comandos: (tenga en cuenta que mi dnx todavía funciona desde la consola del administrador de paquetes y no me gusta abrir una ventana CMD separada para realizar migraciones)Esto creará una instantánea del modelo y una migración inicial en la
Migrations
carpeta paraContextAContext
. Creará una carpeta con el nombre queContextB
contiene estos archivos paraContextBContext
Agregué manualmente una
ContextA
carpeta y moví los archivos de migraciónContextAContext
a esa carpeta. Luego cambié el nombre del espacio de nombres dentro de esos archivos (archivo de instantánea, migración inicial y tenga en cuenta que hay un tercer archivo debajo del archivo de migración inicial ... designer.cs). Tuve que agregar.ContextA
al espacio de nombres, y desde allí el marco lo maneja automáticamente nuevamente.El uso de los siguientes comandos crearía una nueva migración para cada contexto
y los archivos generados se colocan en las carpetas correctas.
fuente
add-migration
se le pediráName
. Esto me desconcertó un poco ya que ya estaba proporcionandoConfigurationTypeName
y me molestó un poco cuando solo dijoName:
. Pero, por supuesto, el Nombre que quiere es la descripción 'legible por humanos' del cambio, por ejemplo.AddedProducts
oIncreaseLengthOfNameFields
. En la carpeta Migraciones, obtendrá esto como parte del nombre de la clase, por lo que es fácil ver qué es qué. Entonces, en efecto,Name
es como un comentario de registro.En caso de que ya tenga una "Configuración" con muchas migraciones y quiera mantenerla como está, siempre puede crear una nueva clase de "Configuración", asígnele otro nombre, como
entonces solo emita el comando
y EF apoyará la migración sin problemas. Finalmente actualice su base de datos, a partir de ahora EF se quejará si no le dice qué configuración desea actualizar:
Hecho.
No es necesario que se ocupe de Enable-Migrations, ya que se quejará de que la "Configuración" ya existe, y el cambio de nombre de su clase de configuración existente traerá problemas al historial de migración.
Puede apuntar a diferentes bases de datos, o la misma, todas las configuraciones compartirán la tabla __MigrationHistory muy bien.
fuente
Si existen más bases de datos, use los siguientes códigos en PowerShell
'Starter' es el nombre de la migración
'EnrollmentAppContext' es el nombre del contexto de mi aplicación
Puede abrir PowerShell en VS haciendo:
Tools->NuGet Package Manager->Package Manager Console
fuente
Para actualizar el tipo de base de datos siguientes códigos en PowerShell ...
* si existe más de una base de datos solo use estos códigos, de lo contrario no es necesario ..
fuente
EF 4.7 en realidad da una pista cuando ejecuta Enable-migrations en múltiples contextos.
Se encontró más de un tipo de contexto en el ensamblado 'Service.Domain'.
fuente