Modifier la chaîne de connexion de manière dynamique (par demande) sur Entity Framework 7 / MVC 6

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

Question

J'ai une application MVC 6 sur laquelle je dois me connecter à une base de données différente (c'est-à-dire un fichier physique mais le même schéma) en fonction de l'utilisateur qui y accède. Autrement dit, chaque client de l'application Web aura ses données isolées dans une base de données SQL (sur Azure, avec des performances, des niveaux de prix différents, etc.), mais toutes ces bases partageront le même schéma relationnel et, bien entendu, le contexte Entity Framework. classe.

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

Le problème est que si j’enregistre le service de cette manière, je l’associe à une base de données concrète pour un client concret, et je ne sais pas si je pourrai le changer lorsque l’exécution du middleware commencera (ce serait un bon peut alors savoir qui sonne à la porte).

Je sais que je peux construire le contexte de base de données en passant la chaîne de connexion en tant que paramètre, mais cela impliquerait que je devrais créer le contexte de base de données au moment de l'exécution (au tout début du processus) pour chaque demande et je ne sais pas si cela pourrait être potentiellement inefficace. ou une mauvaise pratique. De plus, je pense que de cette façon, je ne peux pas enregistrer le contexte de base de données en tant que service pour l'injecter sur mes contrôleurs ...

Quelle est la bonne approche pour cela? Quelqu'un a une configuration similaire travaillant sur la production?

Merci d'avance

Réponse acceptée

Tout d'abord, je ne recommande pas d'échanger des chaînes de connexion par demande.

Mais ce n'est pas la question. Tu peux le faire. Vous devrez transmettre à votre DbContext une nouvelle chaîne de connexion.

.AddDbContext met en cache la chaîne de connexion dans le conteneur d'injection de dépendance, vous ne pouvez donc pas utiliser DI pour que ce scénario fonctionne. Au lieu de cela, vous devrez instancier vous-même votre DbContext et lui transmettre une nouvelle chaîne de connexion.


Réponse populaire

J'aurais préféré ne pas répondre à ma propre question, mais j'estime que je dois offrir des conseils à ceux qui ont un problème similaire, après une recherche longue et approfondie sur Internet, afin de leur faire gagner beaucoup de temps en testant des scénarios de connexion multiple. est assez laborieux ...

J'ai enfin utilisé une fonctionnalité (très récente) et des API Azure appelées "Elastic Database Tools" qui, pour être concis, est un ensemble d'outils de Microsoft visant à résoudre ce problème concret, spécialement pour SaaS (logiciel en tant que service). scénarios (comme le mien est).

Voici un bon lien pour commencer:

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

Bonne chance dans vos projets!



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi