Múltiples contextos de base de datos en la misma base de datos y aplicación en EF 6 y migraciones de Code First

94

Soy nuevo en Entity Framework. Estoy intentando configurar una aplicación MVC que use EF 6. Estoy usando Code First Migrations. Estoy usando Áreas en la aplicación y me gustaría tener diferentes DbContexts en cada área para dividirlo. Sé que EF 6 tiene ContextKey, pero no puedo encontrar información completa sobre cómo usarlo. Actualmente, solo puedo usar migraciones en un contexto a la vez.

¿Alguien puede dar un ejemplo con suficiente detalle para que una nueva persona de EF como yo lo entienda y use?

Lrayh
fuente

Respuestas:

176

Entity Framework 6 agregó soporte para múltiples DbContextcorreos electrónicos agregando los indicadores -ContextTypeNamey -MigrationsDirectory. Acabo de ejecutar los comandos en mi Consola del Administrador de paquetes y pegué el resultado a continuación ...

Si tiene 2 DbContexts en su proyecto y lo ejecuta enable-migrations, obtendrá un error (como probablemente ya sepa):

PM> enable-migrations
More than one context type was found in the assembly 'WebApplication3'.
To enable migrations for 'WebApplication3.Models.ApplicationDbContext', use Enable-Migrations -ContextTypeName WebApplication3.Models.ApplicationDbContext.
To enable migrations for 'WebApplication3.Models.AnotherDbContext', use Enable-Migrations -ContextTypeName WebApplication3.Models.AnotherDbContext.

Entonces tienes que ejecutar enable-migrationscada uno por DbContextseparado. Y tienes que especificar una carpeta para Configuration.csque se genere cada archivo ...

PM> Enable-Migrations -ContextTypeName ApplicationDbContext -MigrationsDirectory Migrations\ApplicationDbContext
Checking if the context targets an existing database...
Code First Migrations enabled for project WebApplication3.

PM> Enable-Migrations -ContextTypeName AnotherDbContext -MigrationsDirectory Migrations\AnotherDbContext
Checking if the context targets an existing database...
Code First Migrations enabled for project WebApplication3.

Para agregar migraciones para cada uno DbContext, hágalo así especificando el nombre completo de la Configurationclase:

PM> Add-Migration -ConfigurationTypeName WebApplication3.Migrations.ApplicationDbContext.Configuration "InitialDatabaseCreation"
Scaffolding migration 'InitialDatabaseCreation'.
The Designer Code for this migration file includes a snapshot of your current Code First model. This snapshot is used to calculate the changes to your model when you scaffold the next migration. If you make additional changes to your model that you want to include in this migration, then you can re-scaffold it by running 'Add-Migration InitialDatabaseCreation' again.

PM> Add-Migration -ConfigurationTypeName WebApplication3.Migrations.AnotherDbContext.Configuration "InitialDatabaseCreation"
Scaffolding migration 'InitialDatabaseCreation'.
The Designer Code for this migration file includes a snapshot of your current Code First model. This snapshot is used to calculate the changes to your model when you scaffold the next migration. If you make additional changes to your model that you want to include in this migration, then you can re-scaffold it by running 'Add-Migration InitialDatabaseCreation' again.

Y corres de update-databasela misma manera:

PM> Update-Database -ConfigurationTypeName WebApplication3.Migrations.ApplicationDbContext.Configuration
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
Applying explicit migrations: [201402032113124_InitialDatabaseCreation].
Applying explicit migration: 201402032113124_InitialDatabaseCreation.
Running Seed method.

PM> Update-Database -ConfigurationTypeName WebApplication3.Migrations.AnotherDbContext.Configuration
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
Applying explicit migrations: [201402032113383_InitialDatabaseCreation].
Applying explicit migration: 201402032113383_InitialDatabaseCreation.
Running Seed method.

Espero que esto ayude.

Anthony Chu
fuente
¿Tengo que tener una cadena de conexión separada para cada contexto o hay alguna forma de evitar eso?
Lrayh
3
Pueden compartir la misma cadena de conexión. Pero desea asegurarse de que no se asignen a las mismas tablas.
Anthony Chu
Si se asignan a la misma tabla, aún puede definir qué migración se ejecutará primero y dejar que su archivo de migración cree la tabla, y cuál se ejecutará en segundo lugar, y modificarlo para que no cree la tabla que ya existe. A continuación, puede utilizar MigrateDatabaseToLatestVersionforjar el ctx.Database.initialize()de cada contexto para que se ejecute en el orden correcto, o ejecutar el Update-Databasecomando a mano en el orden correcto. (Y lo contrario, si realiza una migración de db a la versión anterior). Es "peligroso" pero se puede hacer.
JotaBe
Así que agregué migraciones a mi proyecto y creé un contexto diferente a ApplicationDbContext. Seguí usando ese contexto que eran datos relacionados con el sitio durante aproximadamente 6 meses, luego llegó el momento de empezar a jugar con mi ApplicationUser. Mi inicio de sesión y registro básicos funcionaban, pero quería extender la clase de usuario para agregar algunos campos adicionales. Esta respuesta fue muy útil para establecer una nueva configuración de migración para ese contexto. ¡Gracias! # 1up
Eric Bishard
1
Si puedo darte un +10 por esta respuesta corta pero más que suficiente, lo haría, Gracias @AnthonyChu.
Karim AG