在Entity Framework 7 / MVC 6上動態更改連接字符串(按請求)

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

我有一個MVC 6應用程序,我需要連接到不同的數據庫(即物理文件但相同的模式),具體取決於誰訪問它。也就是說:Web應用程序的每個客戶都將其數據隔離在SQL數據庫中(在Azure上,具有不同的性能,價格水平等),但所有這些數據庫將共享相同的關係模式,當然還有實體框架上下文類。

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

問題是,如果我以這種方式註冊服務,我將它綁定到具體客戶的具體數據庫,我不知道在中間件執行開始時是否可以更改後者(這將是一個好點,因為我誰能知道誰在門口敲響了)。

我知道我可以構建數據庫上下文,將連接字符串作為參數傳遞,但這意味著我應該在運行時(管道的早期)為每個請求創建數據庫上下文,我不知道這是否可能是低效的或者不好的做法。此外,我認為這樣我就無法註冊數據庫上下文作為在我的控制器上註入它的服務...

這是正確的方法是什麼?任何人都有類似的配置在生產?

提前致謝

一般承認的答案

首先,我不建議每個請求交換連接字符串。

但那不是問題。你可以這樣做。您需要為DbContext傳遞一個新的連接字符串。

.AddDbContext在依賴注入容器中緩存連接字符串,因此您無法使用DI使此方案有效。相反,您需要自己實例化DbContext並將其傳遞給新的連接字符串。


熱門答案

我寧願不回答我自己的問題,但我覺得在經過長期深入的互聯網研究之後,我必須為那些有類似問題的人提供指導,這樣我就可以節省大量的時間來測試多連接方案。很辛苦......

我最後使用了一個名為“彈性數據庫工具”的(最新)功能和Azure API,簡潔來說,它是微軟的一套工具,旨在解決這個具體問題,特別是針對SaaS(軟件即服務)場景(如我的)。

這是一個很好的鏈接:

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

祝你的項目好運!




許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因