跟我一起學.NetCore之EF Core 實戰入門,一看就會

Code綜藝圈發表於2020-11-09

前言

還記得當初學習資料庫操作時,用ADO.NET一步一步地進行資料操作及查詢,對於查詢到的資料還得對其進行解析,然後封裝返回給應用層;遇到這種重複而繁瑣的工作,總有一些大神或團隊對其進行封裝,從而出現了很多ORM框架,讓小夥伴把更多精力放在業務處理上,同時更多的面向程式物件開發,對工作效率的提升有很大的幫助。

目前關於C#出現了很多ORM框架,比較流行的大概有FreeSql (國內)、SqlSugar (國內)、Dapper (國外)、EF/EF Core (國外)、linq2db (國外)等,

當然也有一些小夥伴對其進行效能比較,各有優勢吧。從我個人及周圍的小夥伴使用來看,EF/EF Core和Dapper使用率相對比較高。這裡就先說說EF Core,後續逮住機會再和小夥伴一起分享其他;

正文

隨著.NetCore的迅速推進,EF Core也緊跟其步伐。目前長期支援版本是EF Core3.1,而下一個穩定版本EF Core5.0將計劃隨.Net5一起釋出,預計應該會在這個月(2020年11月),可見微軟對EF Core是非常重視的;

對於之前用過EF的小夥伴,應該都知道,EF有三種開發模式:CodeFirst、ModelFirst、DbFirst,這三種根據業務需求及個人偏好用的相對比較多的是DbFirst和CodeFirst;現在EF Core推薦使用CodeFirst的方式進行專案開發,當然也可以通過反向工程的方式,以資料庫設計為先。這裡都會針對這兩種方式進行舉例演示;

image-20201109121929839

在專案中使用CodeFirst方式,這裡用的資料庫是VS自帶的LocalDb,專案還是老規矩,一個WebApi專案;既然實戰入門,肯定得有點樣子才對,所以這裡就簡單模仿了三層架構的形式進行舉例演示,如下專案結構:

img

專案依賴如下:

  • EFCoreTestDemo API專案依賴EFCoreTestModel和EFCoreTestService專案;
  • EFCoreTestService 服務層專案依賴EFCoreTestModel和EFCoreTestRespository專案;
  • EFCoreTestRespository 資料層依賴EFCoreTestModel專案

結構好了,現在開始敲程式碼,比如模擬使用者維護的增刪改查吧; 既然是CodeFirst,先暫時把資料庫放一邊。 如下步驟開始:

  1. 做使用者維護,肯定得有使用者實體,先在Model層中增加一個使用者類;

    img

  2. 接下來就要對資料進行操作,就是所謂的增刪改查,既然用到EF,肯定得有一個DbContext,這個和資料儲存有關,所以將其放在資料層;

    img

  3. 其實到這一步,我比較喜歡先遷移一下,看看是否有問題,能否正常生成資料庫和對應的表;(其實這裡可以不用急著遷移,繼續編碼的,但提前把問題扼殺在搖籃中是很不錯的想法);

    既然要遷移,肯定得把資料的連線字串傳過去,這裡是從WebApi專案的Startup中註冊服務時進行傳遞,並指定遷移程式為WebApi專案:

    img

    上圖中資料庫連線字串從何而來的,自己寫的嗎?哈哈哈,拷貝過來的,這裡順便把之前建立的資料庫都刪了,方便測試,如下圖:

    img

    遷移方式有兩種,一種是命令列的形式,另一種是在VS中的包管理器控制檯(PMC)進行;

    命令列方式:需要安裝命令列工具,這裡使用全域性安裝方式,如下命令:dotnet tool install --global dotnet-ef

    在指定的遷移程式集中安裝Microsoft.EntityFrameworkCore.Design,否則遷移不成功。遷移過程如下圖:

    img

    包管理器控制檯(PMC)方式進行遷移:需要在指定的遷移程式集中安裝Microsoft.EntityFrameworkCore.Tools包,否則遷移失敗:

    img

  4. 遷移沒問題,繼續回到程式碼邏輯;現在應該開始編輯業務程式碼,即對使用者的增刪改查,先從資料層開始吧,具體步驟見下圖編號:

    img

    業務層:

    img

    控制器:

    img

    使用自帶依賴注入:

    img

  5. 剩下的就是執行看結果啦,這裡沒有繼承Swagger,使用Postman工具進行測試,如下圖:

    img

通過以上步驟,使用EF Core的CodeFirst 從建立實體->遷移->最後業務編寫的流程基本就是這樣啦;後續如果新增實體,還是重複以上步驟。說完流程,接著說說上面過程中其他技術點↓↓↓

增刪改查操作

增加使用者案例,首先將原有物件進行包裝,然後通過標識包裝物件的狀態,最後通過SaveChanges進行統一執行操作,如下:

img

使用者的刪除、更新與新增時同樣的道理,如下:

img

查詢,一般通過DbContext自帶方法、Lamda表示式,或是Linq語句,同樣查出可追蹤的包裝物件,但是可以將其查詢設定為不可追蹤,有時候為了提高效能,會針對進行設定或整體設定:

img

整體設定不追蹤:

img

遷移命令

上面說到的遷移命令只有新增遷移和更新資料庫,還有一些常用的指令也比較常用,如下:

img

通常,生成環境下一般都會採用指令碼的方式生成資料庫和表,那開發的時候是通過命令進行的,如何生成對應的指令碼呢? 如下圖:

img

對於刪除遷移的場景,一般會是對當前遷移不滿意,比如欄位寫錯了、型別誤用等情況,如下:

img

如上圖,新增遷移已經完成了,但是由於Age使用的型別不對,要廢棄這次遷移,重新進行遷移,當然也不可以不刪除,但對後續查詢歷史遷移記錄的時候會產生誤解。如下刪除最近一次遷移,如下:

img

表問題

在上面遷移的過程中,並沒有指定表明和欄位及設定對應的列型別,是EF Core框架按照預設規則,自動幫我們生成了,是不是很貼心,但是既然是預設,框架肯定不知道我們到底需要什麼,如下生成的表:

img

如上圖所示,EF Core框架預設將類名作為表明,生成的字串長度都預設為最大,這些肯定不是我們想要的,所以作者肯定想到這,給我們提供了修改的方法,我們通常會採用註解的方式或是FluentApi的形式進行約束和更改,註解直接在對應列上標註,但一般會推薦使用FluentApi,相對比較靈活;在DbContext中的OnModelCreating中編寫對應程式碼即可,如下:

img

然後重新遷移並更新到資料庫,如下:

img

Linq查詢

EF使用的過程中,Linq應該是少不了的,估計有小夥伴會說,直接用DbContext中提供的方法和Lamda表示式就行啦,是,那肯定是可以的,只能說還沒用到精髓,哈哈哈,面向程式碼程式設計的SQL查詢語句,用起來是很方便的,如下:

img

是不是看起來像SQL,雖然說是Linq新語法,但看著不陌生,用著也很方便;這裡不打算深入說,只是給小夥伴們提上一嘴;那麼無情嗎?當然不,我把之前收集到的Linq文件已經上傳,小夥伴們可以參考一下:

官方文件:https://docs.microsoft.com/zh-cn/dotnet/csharp/linq/

收集文件:

連結:https://pan.baidu.com/s/1BZivBXG9WT-gOqsXKG08Ng

提取碼:9qyu

img

反向工程(先有資料庫設計,然後根據資料庫生成對應Model)

對於一些專案,當小夥伴們接到手時候已經把資料庫設計好了,這種情況沒必要犟著一個一個實體敲,重新生成資料庫,完全可以通過資料庫反向生成程式碼,反正怎麼方便就怎麼來;還有一種情況就是很多小夥伴還是比較喜歡資料庫優先的開發模式,直接反向工程就好啦;

這裡用之前建立的資料和User表,然後建了一個test專案,裡面只安裝了EF Core的核心包和Design包,如下:

img

同樣使用命令列或包管理控制檯都行,這裡就使用命令列,在test專案目錄下執行以下命令(這裡是SqlServer,還需要安裝Microsoft.EntityFrameworkCore.SqlServer包):

dotnet ef dbcontext scaffold "Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=EFCoreTest1;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False" "Microsoft.EntityFrameworkCore.SqlServer" -o ./Models --context EFCoreTestContext  --context-dir ./ -f

以上命令簡單說明:

dotnet ef dbcontext scaffold後面指定資料庫連線字串;

第二個引數代表是對應資料庫指定的Provider,及對應資料庫對應的Nuget包;

-o:代表是生成的實體類存放的位置;

--context:生成的dbContext的類名稱;

--context-dir:指定生成的dbContext存放的位置;

-f:覆蓋現有檔案;

-v:顯示遷移過程及報錯資訊;

-t:指定表反向生成程式碼,如果不指定代表所有表都生成;

-n:指定生成類名的名稱空間,這個EF Core5.0提供;

—context-namespace:指定生成DbContext的名稱空間,這個EF Core5.0提供;

注:生成的類和DbContext可以根據引數最終生成到對應位置,滿足自己需求。

如果是MySql,需要安裝Pomelo.EntityFrameworkCore.MySql包,其他步驟都一樣,這裡就不演示了,就留給小夥伴練習吧;真的不要嫌簡單,只有親手做了,遇到問題,然後解決,最終才能提升,親身體會。

總結

這裡只是簡單說說EF Core的使用,遷移流程及反向工程操作分享,其他的進階使用會陸續分享,小夥伴們也可以自己去加強,我這裡有的資源,都會進行分享;說到這,後續檔案下載地址大家只能在公眾號聊我啦,前兩篇由於博文帶檔案下載地址,有些部落格平臺把我禁言了,很是尷尬,不過修改申訴過啦。

博文原始碼github地址:https://github.com/zyq025/DotNetCoreStudyDemo

一個被程式搞醜的帥小夥,關注"Code綜藝圈",識別關注跟我一起學~~~

擼文不易,莫要白瞟,三連走起~~~~

相關文章