使用Entity Framework Core訪問數據庫(DB2篇)
上一篇講了一些EF Core訪問Oracle的坑。(感興趣請移步:使用Entity Framework Core訪問數據庫(Oracle篇))
這篇主要講一下關於EF Core訪問DB2的一攬子~問題。
本篇采用DBFirst直接生成實體。
關於EF Core DB2 的官方文檔:點這裏(E文好的可以參考)
正文1.生成上下文實體,並訪問數據庫
首先我們當然是生成上下文實體啦~
我們創建一個空的控制臺程序如下:
然後Nuget添加引用:
Microsoft.EntityFrameworkCore.Tools(DBFirst的生成工具 必須的)
IBM.EntityFrameworkCore(DB2官方的庫,這個庫請註意,是Windows版本的,後面我們講解各類版本的區別)
然後我們打開Nuget控制臺
輸入DBFirst的生成語句 生成上下文,語句如下:
Scaffold-DbContext "這裏是你的連接字符串;" IBM.EntityFrameworkCore
生成效果如下:
這樣我們就生成了我們的上下文實體。
我們編寫一個簡單的查詢語句,查詢一下Price表的數據量:
class Program { static void Main(string[] args) { using (MYTESTDBContext db = new MYTESTDBContext()) {var date = db.Price.Count(); Console.WriteLine(date); Console.ReadLine(); } } }
效果如下:
證明我們的上下文是沒什麽問題的,至此關於Windows系統的DB2訪問。。就完美結束了。。
2.關於在其他系統使用DB2的小問題。
上面我們使用的開發機是windows系統,所以直接引用了
IBM.EntityFrameworkCore包。
但是我們在Nuget搜索關鍵字IBM.EntityFrameworkCore
你會發現它有三個包,如下:
So...一臉黑人懵比。。
其實在官方文檔中已經解釋過了。
Windows系統使用:IBM.EntityFrameworkCore
Linux系統使用:IBM.EntityFrameworkCore-Inx
MacOS系統使用:IBM.EntityFrameworkCore-osx
在生成上下文的時候,前面的步驟無需改動。最後生成的語句改成你對應的dll即可。
所以 有些在MacOS本上使用VS code的兄弟。。請引用osx的包哦。
3.關於在Docker中部署的問題。
我這個項目也是一個移植類的項目。既然要費心的移植,那目的當然是跑在linux系統上。。打包到docker 實現容器化部署
所以。。
但是我們的開發機又是windows系統。。
所以我們需要在引用一下IBM.EntityFrameworkCore-Inx(PS:同時引用2個包不會有沖突)
然後我們生成。。部署到docker。。
你會發現。。項目跑起來了。。但是查詢數據庫。。又掛掉了。。
錯誤信息如下:
Unhandled Exception: System.DllNotFoundException: Unable to load DLL ‘libdb2.so‘: The specified module could not be found.
缺少依賴包,這個問題糾結了我一夜。。
後來查詢各種資料(查到淩晨。。MMP)發現,官方有一篇博客對這個問題進行了說明。但是解決方案我覺得並不是很合適,文章地址:點這裏
官方介紹是因為在docker環境中缺少了一個名為libxml2.so.2的依賴庫
我們需要自己下載這個庫。。(百度搜索 )
說一下為什麽我覺得官方的解決方案不是很合適,以為他需要我們在main方法中加一段設置linux快捷訪問的代碼。
其實我們完全可以把這段操作放在我們的DockerFile中。
所以我們最終的DockerFile應該如下:
FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base WORKDIR /app COPY . /app EXPOSE 80 COPY . ./ COPY clidriver /app/clidriver COPY libs/libxml2.so.2.9.1 /app/clidriver/lib/libxml2.so.2.9.1 RUN ln /app/clidriver/lib/libxml2.so.2.9.1 /app/clidriver/lib/libxml2.so.2 ENV LD_LIBRARY_PATH="/app/clidriver/lib/" ENV PATH=$PATH:"/app/clidriver/bin:/app/clidriver/lib" ENTRYPOINT ["dotnet", "DockerTest.dll"]
然後查看我們的項目。。即可成功訪問DB2數據庫。~
結束語
說起來都是淚,國內關於EF Core訪問 DB2的資料實在是太少太少了(ps:包括國外也不多。。)。。我都懷疑我是第一個吃螃蟹的人。。。
寫這篇博客 也是希望記錄一下,下次可以在回來查看。備忘。。哈哈。。
使用Entity Framework Core訪問數據庫(DB2篇)