Cambie la cadena de conexión dinámicamente (por solicitud) en Entity Framework 7 / MVC 6

asp.net-core asp.net-core-mvc azure-sql-database entity-framework-core

Pregunta

Tengo una aplicación MVC 6 en la que necesito conectarme a una base de datos diferente (es decir, un archivo físico pero el mismo esquema) según quién acceda a ella. Es decir: cada cliente de la aplicación web tendrá sus datos aislados en una base de datos SQL (en Azure, con diferentes rendimientos, niveles de precios, etc.) pero todas esas bases de datos compartirán el mismo esquema relacional y, por supuesto, el contexto de Entity Framework clase.

var cadConexion = @"Server=(localdb)\mssqllocaldb;Database=DBforCustomer1;Trusted_Connection=True;";
services.AddEntityFramework().AddSqlServer().AddDbContext<DAL.ContextoBD>(options => options.UseSqlServer(cadConexion));

El problema es que si registro el servicio de esta manera lo he vinculado a una base de datos concreta para un cliente concreto, y no sé si puedo cambiar este último cuando comience la ejecución del middleware (este sería un buen punto ya que Puedo saber entonces quién está sonando en la puerta).

Sé que puedo construir el contexto de la base de datos pasando la cadena de conexión como un parámetro, pero esto implicaría que debería crear el contexto de la base de datos en tiempo de ejecución (al inicio de la tubería) para cada solicitud y no sé si esto podría ser potencialmente ineficiente o una mala práctica. Además, creo que de esta manera no puedo registrar el Contexto de la Base de Datos como un servicio para inyectarlo en mis controladores ...

¿Cuál es el enfoque correcto para esto? ¿Alguien tiene una configuración similar trabajando en producción?

Gracias por adelantado

Respuesta aceptada

En primer lugar, no recomiendo intercambiar cadenas de conexión por solicitud.

Pero esa no es la pregunta. Puedes hacerlo. Deberá pasar su nueva cadena de conexión a su DbContext.

.AddDbContext almacena en caché la cadena de conexión en el contenedor de inyección de dependencia, por lo que no puede usar DI para que este escenario funcione. En su lugar, deberá crear una instancia de DbContext y pasarle una nueva cadena de conexión.


Respuesta popular

Hubiera preferido no contestar mi propia pregunta, pero creo que debo ofrecer orientación a aquellos con un problema similar, después de una larga y profunda investigación en Internet para poder ahorrarles mucho tiempo probando escenarios de conexión múltiple, que es bastante laborioso ...

Finalmente, he utilizado una característica (muy reciente) y API de Azure llamadas "Herramientas de base de datos elásticas" que, para ser concisas, son un conjunto de herramientas de Microsoft destinadas a solucionar este problema concreto, especialmente para SaaS (software como servicio) Escenarios (como el mio es).

Aquí hay un buen enlace para comenzar con:

https://azure.microsoft.com/en-us/documentation/articles/sql-database-elastic-scale-get-started/

Buena suerte con tus proyectos!




Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué