歡迎光臨
每天分享高質量文章

使用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:包括國外也不多。。)。。我都懷疑我是第一個吃螃蟹的人。。。

寫這篇部落格 也是希望記錄一下,下次可以在回來檢視。備忘。。哈哈。

已同步到看一看
贊(0)

分享創造快樂