使用Entity Framework Core訪問數據庫(DB2篇)

前言

上一篇講了一些EF Core訪問Oracle的坑。(感興趣請移步:使用Entity Framework Core訪問數據庫(Oracle篇)html

這篇主要講一下關於EF Core訪問DB2的一攬子~問題。linux

本篇採用DBFirst直接生成實體。docker

 關於EF Core DB2 的官方文檔:點這裏(E文好的能夠參考)數據庫

正文

1.生成上下文實體,並訪問數據庫

   首先咱們固然是生成上下文實體啦~windows

    咱們建立一個空的控制檯程序以下:app

而後Nuget添加引用:ide

Microsoft.EntityFrameworkCore.Tools(DBFirst的生成工具 必須的)工具

IBM.EntityFrameworkCore(DB2官方的庫,這個庫請注意,是Windows版本的,後面咱們講解各種版本的區別)post

而後咱們打開Nuget控制檯spa

輸入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:包括國外也很少。。)。。我都懷疑我是第一個吃螃蟹的人。。。

寫這篇博客 也是但願記錄一下,下次能夠在回來查看。備忘。。哈哈。。

相關文章
相關標籤/搜索