EF 6: Multiples contextos y migraciones para la misma base de datos

Una de las nuevas características de EF 6 es el soporte para múltiples modelos en una base de datos, creo que alguna vez lo he mencionado desde este mismo blog. Tal y como podemos ver en el feature specification  del equipo de producto esta característica se basa principalmente en la nueva propiedad ContextKey de nuestra tabla MigrationHistory y la propagación del esquema de cada contexto. Aunque ya hay algunos ejemplos de esta característica por internet como por ejemplo este de Julie, me gustaría ver un pequeños trick para aprovecharnos de esta característica con diferentes contextos en un mismo proyecto.

Como todos sabéis, el primer paso para habilitar las migraciones es ejecutar el comando enable-migrations, el cual por defecto, nos crea una nueva carpeta llamada Migrations con la configuración de la migración de un contexto de trabajo. El problema es que, si tenemos varios contextos, este comando no sabrá de cual queremos hacer nuestra configuración de migración y nos mostrará un mensaje como el siguiente:

 

PM> enable-migrations
More than one context type was found in the assembly ‘MultipleContextDatabase’.
To enable migrations for ‘MultipleContextDatabase.ContextA.ContextA’, use Enable-Migrations -ContextTypeName MultipleContextDatabase.ContextA.ContextA.
To enable migrations for ‘MultipleContextDatabase.ContextB.ContextB’, use Enable-Migrations -ContextTypeName MultipleContextDatabase.ContextB.ContextB.

Aunque en principio, estemos tentados por probar alguna de las soluciones que el mensaje de error nos ofrece, en realidad no ganaremos nada, puesto que lo único que haríamos es tener habilitadas las migraciones para alguno de los contextos pero no para ámbos como necsitamos. La solución, para tener varias configuraciones de migración, es que las mismas estén en diferentes carpetas, para lo cual podemos aprovecharnos del flag MigrationsDirectory.

PM>enable-migrations -ContextTypeName MultipleContextDatabase.ContextA.ContextA -MigrationsDirectory:MigrationsA

 

PM>enable-migrations -ContextTypeName MultipleContextDatabase.ContextB.ContextB -MigrationsDirectory:MigrationsB

 

 

Con estas dos sencilla ejecuciones ya tenemos nuestras dos configuraciones de migración creadas. Por supuesto, para crear nuevas migraciones o actualizar la base de datos será necesario especificar que configuración de migración queremos usar, por ello, todos los comandos ponen a nuestra disposición el flag ConfigurationTypeName. A continuación, podemos ver un ejemplo:

 

PM> Add-Migration Initial -ConfigurationTypeName MultipleContextDatabase.MigrationsA.Configuration

 

 

Bien, hasta aquí este pequeño trick

 

Un saludo

Unai