Saltar al contenido

¿Cómo habilito las migraciones de EF para múltiples contextos para separar bases de datos?

Solución:

La segunda llamada a Enable-Migrations está fallando 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.

A continuación, deberá especificar qué configuración desea utilizar al actualizar las bases de datos.

Update-Database -ConfigurationTypeName MyRenamedConfiguration

Además de lo que sugirió @ckal, es crítico para dar 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 me funcionan bien.

Si las migraciones están en mal estado y desea crear una nueva “línea de base”:

  1. Elimine cualquier archivo .cs existente en la carpeta Migraciones
  2. En SSMS, elimine la tabla del sistema __MigrationHistory.

Creando la migración inicial:

  1. En la consola del Administrador de paquetes:

    Enable-Migrations -EnableAutomaticMigrations -ContextTypeName
    NamespaceOfContext.ContextA -ProjectName ProjectContextIsInIfNotMainOne
    -StartupProjectName NameOfMainProject  -ConnectionStringName ContextA
    
  2. 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

  3. Enable-Migrations -EnableAutomaticMigrations -ContextTypeName
    NamespaceOfContext.ContextB -ProjectName ProjectContextIsInIfNotMainOne
    -StartupProjectName NameOfMainProject  -ConnectionStringName ContextB
    
  4. En el Explorador de soluciones: cambie el nombre de Migrations.Configuration.cs a Migrations.ConfigurationB.cs. Una vez más, asegúrese de que el nombre del constructor también sea apropiado. Editar ConfigurationB.cs: cambie el espacio de nombres a NamespaceOfContext.Migrations.MigrationsB

  5. add-migration InitialBSchema -IgnoreChanges -ConfigurationTypeName
    ConfigurationB -ProjectName ProjectContextIsInIfNotMainOne
    -StartupProjectName NameOfMainProject  -ConnectionStringName ContextB 
    
  6. Update-Database -ConfigurationTypeName ConfigurationB -ProjectName
    ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject
    -ConnectionStringName ContextB
    
  7. add-migration InitialSurveySchema -IgnoreChanges -ConfigurationTypeName
    ConfigurationA -ProjectName ProjectContextIsInIfNotMainOne -StartupProjectName
    NameOfMainProject  -ConnectionStringName ContextA 
    
  8. Update-Database -ConfigurationTypeName ConfigurationA -ProjectName
    ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject
    -ConnectionStringName ContextA
    

Pasos para crear scripts de migración en Package Manager Console:

  1. Ejecutar comando

    Add-Migration MYMIGRATION -ConfigurationTypeName ConfigurationA -ProjectName
    ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject
    -ConnectionStringName ContextA
    

    o –

    Add-Migration MYMIGRATION -ConfigurationTypeName ConfigurationB -ProjectName
    ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject
    -ConnectionStringName ContextB
    

    Está bien volver a ejecutar este comando hasta que se apliquen los cambios a la base de datos.

  2. Ejecute los scripts en la base de datos local deseada o ejecute Update-Database sin -Script para aplicar localmente:

    Update-Database -ConfigurationTypeName ConfigurationA -ProjectName
    ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject
    -ConnectionStringName ContextA
    

    o –

    Update-Database -ConfigurationTypeName ConfigurationB -ProjectName
    ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject
    -ConnectionStringName ContextB
    

Me encontré con el mismo problema y utilicé la siguiente solución (todo desde la Consola del Administrador de paquetes)

PM> Enable-Migrations -MigrationsDirectory "MigrationsContextA" -ContextTypeName MyProject.Models.ContextA
PM> Enable-Migrations -MigrationsDirectory "MigrationsContextB" -ContextTypeName MyProject.Models.ContextB

Esto creará 2 carpetas separadas en la carpeta Migraciones. Cada uno contendrá el generado Configuration.cs expediente. Desafortunadamente, todavía tienes que cambiarles el nombre Configuration.cs archivos de lo contrario habrá quejas por tener dos de ellos. Cambié el nombre de mis archivos a ConfigA.cs y ConfigB.cs

EDITAR: (cortesía de Kevin McPheat) Recuerde que al cambiar el nombre de los archivos Configuration.cs, también cambie el nombre de las clases y los constructores /EDITAR

Con esta estructura puedes simplemente hacer

PM> Add-Migration -ConfigurationTypeName ConfigA
PM> Add-Migration -ConfigurationTypeName ConfigB

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)

PM> Update-Database -ConfigurationTypeName ConfigA
PM> Update-Database -ConfigurationTypeName ConfigB

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 parece violar algunas convenciones de nomenclatura, así que ahora uso ContextAContext y ContextBContext. 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)

PM> dnx ef migrations add Initial -c "ContextAContext"
PM> dnx ef migrations add Initial -c "ContextBContext"

Esto creará una instantánea del modelo y una migración inicial en el Migrations carpeta para ContextAContext. Creará una carpeta llamada ContextB que contiene estos archivos para ContextBContext

Agregué manualmente un ContextA carpeta y movió los archivos de migración de ContextAContext en 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 framework lo maneja automáticamente de nuevo.

El uso de los siguientes comandos crearía una nueva migración para cada contexto

PM>  dnx ef migrations add Update1 -c "ContextAContext"
PM>  dnx ef migrations add Update1 -c "ContextBContext"

y los archivos generados se colocan en las carpetas correctas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *