使用Entity Framework Core访问数据库(DB2篇)
上一篇講了一些EF Core訪問Oracle的坑。(感興趣請(qǐng)移步:使用Entity Framework Core訪問數(shù)據(jù)庫(Oracle篇))
這篇主要講一下關(guān)于EF Core訪問DB2的一攬子~問題。
本篇采用DBFirst直接生成實(shí)體。
?關(guān)于EF Core DB2 的官方文檔:點(diǎn)這里(E文好的可以參考)
正文
1.生成上下文實(shí)體,并訪問數(shù)據(jù)庫
? ?首先我們當(dāng)然是生成上下文實(shí)體啦~
? ? 我們創(chuàng)建一個(gè)空的控制臺(tái)程序如下:
然后Nuget添加引用:
Microsoft.EntityFrameworkCore.Tools(DBFirst的生成工具 必須的)
IBM.EntityFrameworkCore(DB2官方的庫,這個(gè)庫請(qǐng)注意,是Windows版本的,后面我們講解各類版本的區(qū)別)
然后我們打開Nuget控制臺(tái)
輸入DBFirst的生成語句 生成上下文,語句如下:
Scaffold-DbContext "這里是你的連接字符串;" IBM.EntityFrameworkCore生成效果如下:
這樣我們就生成了我們的上下文實(shí)體。
我們編寫一個(gè)簡單的查詢語句,查詢一下Price表的數(shù)據(jù)量:
class Program{
static void Main(string[] args)
{
using (MYTESTDBContext db = new MYTESTDBContext())
{
var date = db.Price.Count();
Console.WriteLine(date);
Console.ReadLine();
}
}
}
效果如下:
證明我們的上下文是沒什么問題的,至此關(guān)于Windows系統(tǒng)的DB2訪問。。就完美結(jié)束了。。
2.關(guān)于在其他系統(tǒng)使用DB2的小問題。
上面我們使用的開發(fā)機(jī)是windows系統(tǒng),所以直接引用了
IBM.EntityFrameworkCore包。但是我們?cè)贜uget搜索關(guān)鍵字IBM.EntityFrameworkCore
你會(huì)發(fā)現(xiàn)它有三個(gè)包,如下:
So...一臉黑人懵比。。
其實(shí)在官方文檔中已經(jīng)解釋過了。
Windows系統(tǒng)使用:IBM.EntityFrameworkCore
Linux系統(tǒng)使用:IBM.EntityFrameworkCore-Inx
MacOS系統(tǒng)使用:IBM.EntityFrameworkCore-osx
在生成上下文的時(shí)候,前面的步驟無需改動(dòng)。最后生成的語句改成你對(duì)應(yīng)的dll即可。
所以 有些在MacOS本上使用VS code的兄弟。。請(qǐng)引用osx的包哦。
?
3.關(guān)于在Docker中部署的問題。
我這個(gè)項(xiàng)目也是一個(gè)移植類的項(xiàng)目。既然要費(fèi)心的移植,那目的當(dāng)然是跑在linux系統(tǒng)上。。打包到docker 實(shí)現(xiàn)容器化部署
所以。。
但是我們的開發(fā)機(jī)又是windows系統(tǒng)。。
所以我們需要在引用一下IBM.EntityFrameworkCore-Inx(PS:同時(shí)引用2個(gè)包不會(huì)有沖突)
然后我們生成。。部署到docker。。
你會(huì)發(fā)現(xiàn)。。項(xiàng)目跑起來了。。但是查詢數(shù)據(jù)庫。。又掛掉了。。
錯(cuò)誤信息如下:
Unhandled Exception: System.DllNotFoundException: Unable to load DLL 'libdb2.so': The specified module could not be found.缺少依賴包,這個(gè)問題糾結(jié)了我一夜。。
后來查詢各種資料(查到凌晨。。MMP)發(fā)現(xiàn),官方有一篇博客對(duì)這個(gè)問題進(jìn)行了說明。但是解決方案我覺得并不是很合適,文章地址:點(diǎn)這里
官方介紹是因?yàn)樵赿ocker環(huán)境中缺少了一個(gè)名為libxml2.so.2的依賴庫
我們需要自己下載這個(gè)庫。。(百度搜索 )
說一下為什么我覺得官方的解決方案不是很合適,以為他需要我們?cè)趍ain方法中加一段設(shè)置linux快捷訪問的代碼。
其實(shí)我們完全可以把這段操作放在我們的DockerFile中。
所以我們最終的DockerFile應(yīng)該如下:
FROM microsoft/dotnet:2.1-aspnetcore-runtime AS baseWORKDIR /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"]
然后查看我們的項(xiàng)目。。即可成功訪問DB2數(shù)據(jù)庫。~
結(jié)束語
說起來都是淚,國內(nèi)關(guān)于EF Core訪問 DB2的資料實(shí)在是太少太少了(ps:包括國外也不多。。)。。我都懷疑我是第一個(gè)吃螃蟹的人。。。
寫這篇博客 也是希望記錄一下,下次可以在回來查看。備忘。。哈哈。
原文地址:https://www.cnblogs.com/GuZhenYin/p/10790956.html
.NET社區(qū)新聞,深度好文,歡迎訪問公眾號(hào)文章匯總?http://www.csharpkit.com?
總結(jié)
以上是生活随笔為你收集整理的使用Entity Framework Core访问数据库(DB2篇)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NetCore + SignalR 实现
- 下一篇: Linux中以单容器部署Nginx+AS