Modificare la stringa di connessione in modo dinamico (per richiesta) su Entity Framework 7 / MVC 6

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

Domanda

Ho un'applicazione MVC 6 su cui ho bisogno di connettermi a un database diverso (ad esempio il file fisico ma lo stesso schema) a seconda di chi ci sta accedendo. Cioè: ogni cliente dell'applicazione Web avrà i suoi dati isolati in un database SQL (su Azure, con diverse prestazioni, livelli di prezzo, ecc.) Ma tutti quei database condivideranno lo stesso schema relazionale e, naturalmente, il contesto di Entity Framework classe.

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

Il problema è che se registro il servizio in questo modo l'ho collegato ad un database concreto per un cliente concreto, e non so se posso cambiare quest'ultimo quando inizia l'esecuzione del middleware (questo sarebbe un buon punto dato che può sapere poi chi sta suonando alla porta).

So che posso costruire il contesto del database passando la stringa di connessione come parametro ma questo implicherebbe che dovrei creare il contesto del database in fase di esecuzione (all'inizio della pipeline) per ogni richiesta e non so se questo potrebbe essere potenzialmente non efficiente o una cattiva pratica. Inoltre, penso che in questo modo non riesco a registrare Database Context come servizio per iniettarlo sui miei controller ...

Qual è l'approccio corretto per questo? Qualcuno ha una configurazione simile lavorando sulla produzione?

Grazie in anticipo

Risposta accettata

Prima di tutto, non consiglio di scambiare stringhe di connessione per richiesta.

Ma non è questa la domanda. Puoi farlo. Dovrai passare a DbContext una nuova stringa di connessione.

.AddDbContext memorizza nella cache la stringa di connessione nel contenitore di .AddDbContext delle dipendenze, quindi non è possibile utilizzare DI per rendere questo scenario funzionante. Invece, dovrai istanziare il tuo DbContext da solo e passargli una nuova stringa di connessione.


Risposta popolare

Avrei preferito non rispondere alla mia domanda, ma sento di dover offrire una guida a coloro che hanno un problema simile, dopo una lunga e approfondita ricerca su Internet, così posso risparmiare molto tempo a testare scenari di connessione multipla, è piuttosto laborioso ...

Finalmente ho usato una (molto recente) funzionalità e API di Azure chiamata "Elastic Database Tools" che, per essere concisi, è un insieme di strumenti di Microsoft volti a risolvere questo problema concreto, specialmente per SaaS (software come servizio) scenari (come il mio è).

Ecco un buon link per iniziare:

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

Buona fortuna con i tuoi progetti!



Related

Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché