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
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.
Avrei preferito non rispondere alla mia domanda, ma sento che devo offrire una guida a coloro che hanno un problema simile, dopo una lunga e approfondita ricerca su Internet in modo da poterli risparmiare un sacco di tempo testando scenari multi-connessione, che è abbastanza laborioso ...
Ho finalmente usato una funzionalità (molto recente) e API di Azure chiamate "Elastic Database Tools" che, per essere concisi, è un insieme di strumenti di Microsoft volti a risolvere questo problema concreto, specialmente per SaaS (software as a service) 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!