iT邦幫忙

0

[EF Core] 連接不同DB Provider

  • 分享至 

  • xImage

各位大大好
小弟近日剛接觸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

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

1
天黑
iT邦研究生 5 級 ‧ 2022-03-10 11:46:53

DI架構下,原本就可以多注入幾個DbContext,所以動態抽換這邊我不太理解...,需要使用多個db時,就是把需要的DbContext都注入就可以,至於appSettings部分,這個是一定要設定的,除非想寫死在程式碼裡面...當然也可能是我還不理解你的需求...

weilin510 iT邦新手 5 級 ‧ 2022-03-10 19:23:40 檢舉

非常謝謝大大的回覆/images/emoticon/emoticon25.gif
我有將上面問題的論述在打得清楚一點了

你的回答有幫助到我
原本很沒有方向,現在知道要去搜尋哪一塊了!
我想我可能先去了解一下DI注入原理
再看看有沒有相關的實作

天黑 iT邦研究生 5 級 ‧ 2022-03-11 11:01:30 檢舉

其實做法一樣啊,就跟黑大文章做得差不多,帶入參數產生多個dbcontext,要用哪個就用哪個,幫你找一個參考

1
無敵銅金剛
iT邦新手 5 級 ‧ 2022-03-10 14:27:03

看了你的步驟,不同Db用同一份DbContext,似乎那些DB的資料結構都是一樣。如果是一樣,3種方法皆可行。

如果都不同,如同樓上所說,可以使用DI,註冊多個DbContext,使用時再注入即可。
可參考:
ASP.NET Core 3 系列 - 注入多個相同的介面 (Interface)
C# Switch 重構 Refactoring 3 : 使用策略設計模式與簡易相依注入

全部方法的ConnectionString都建議寫在appsettings.json中。

建議可以補充一下動態抽換的時機和DB的資料結構是不是都相同。

weilin510 iT邦新手 5 級 ‧ 2022-03-10 19:20:28 檢舉

先謝謝大大願意抽空回答/images/emoticon/emoticon02.gif

沒錯,不同DB Provider中資料的Schema都是一樣的
動態抽換試希望可以改參數就連接到不同的目標DB Provider上取資料
P.S.我有修改發問的內容了

我順便去研究一下 DI 注入的概念好了

之前因為都是做 Data類的研究比較多,都是寫Python
非常少用到C# 這類物件導向的語言 QQ
所以還有很多東西都還不太熟

我要發表回答

立即登入回答