各位大大好
小弟近日剛接觸C#
之前寫C#是在大一(2014)時,那時都還是最簡單的Window Form應用
物件導向的概念也蠻弱的...
近期因為工作需求必須開始研究
目前遇到一個需求是:開發 .NET MVC Core網頁應用程式,使用Entity Framework Core連接DB時
能動態抽換(帶參數去選擇)要連接的DB Provider (e.g. Oracel, MSSQL, mySQL)
以讀取不同DB Provider上的資料
註:雖然DB Provider不同,但是DB裡面資料的Schema都相同
希望可以利用EF Core code-first的特性,省去切換不同DB Provider,SQL Query語法就要重寫的麻煩
[補充]這邊動態抽換的意思是,之前查到一個方法(https://blog.darkthread.net/blog/ef-core-notes-4/ )
但這個方法每次編譯時,都需要手動更改參數,所以想研究能不能在程式執行期間
透過給定不同參數,去連線不同DB Provider
有Survey到一些解法,但不知道方向正不正確
方法一 : 一個DB Provider 就建立一個 DbContext
方法二 : 在appSettings.json中設定連線字串
方法三 : 自行建立工廠類別(設計模式)
或是前輩們有其他更好的方法,都很歡迎?
我把大致的步驟整理在NOTION中 (公司有擋上傳圖片)
因為不太熟悉.NET MVC Core專案,所以文字敘述可能不是很精準,再請包涵指教囉~
https://fishy-cent-e7b.notion.site/Survey-EF-Core-DB-Provider-e0dea32e54c04932ac6d2b24034c0aa8
希望大大可以指點,或是給一些研究方向
謝謝
參考資料:
方法一 : 一個DB Provider 建立一個 DbContext
https://entityframework.net/change-connection-at-runtime
方法二 : 在appSettings.json中設定連線字串
https://dev.to/moesmp/ef-core-multiple-database-providers-3gb7
https://stackoverflow.com/questions/52365060/entity-framework-core-2-1-multiple-providers
https://stackoverflow.com/questions/60976990/how-can-i-switch-the-database-provider-used-by-ef-core-based-on-configuration
https://logu.co/efcore-multiple-providers.html
方法三 : 自行建立工廠類別
https://stackoverflow.com/questions/68822517/multiple-dbcontext-at-run-time-with-multiple-providers
https://ithelp.ithome.com.tw/articles/10205468
https://ithelp.ithome.com.tw/articles/10194363
DI架構下,原本就可以多注入幾個DbContext,所以動態抽換這邊我不太理解...,需要使用多個db時,就是把需要的DbContext都注入就可以,至於appSettings部分,這個是一定要設定的,除非想寫死在程式碼裡面...當然也可能是我還不理解你的需求...
非常謝謝大大的回覆
我有將上面問題的論述在打得清楚一點了
你的回答有幫助到我
原本很沒有方向,現在知道要去搜尋哪一塊了!
我想我可能先去了解一下DI注入原理
再看看有沒有相關的實作
其實做法一樣啊,就跟黑大文章做得差不多,帶入參數產生多個dbcontext,要用哪個就用哪個,幫你找一個參考
看了你的步驟,不同Db用同一份DbContext,似乎那些DB的資料結構都是一樣。如果是一樣,3種方法皆可行。
如果都不同,如同樓上所說,可以使用DI,註冊多個DbContext,使用時再注入即可。
可參考:
ASP.NET Core 3 系列 - 注入多個相同的介面 (Interface)
C# Switch 重構 Refactoring 3 : 使用策略設計模式與簡易相依注入
全部方法的ConnectionString都建議寫在appsettings.json中。
建議可以補充一下動態抽換的時機和DB的資料結構是不是都相同。