.NET WebApi 實(shí)戰(zhàn)第二講之使用EF實(shí)現(xiàn)接口查詢

上一講,我們已經(jīng)創(chuàng)建了Web Api的基礎(chǔ)框架,已經(jīng)可以通過(guò)HTTP進(jìn)行簡(jiǎn)單的訪問(wèn)及簡(jiǎn)單的數(shù)據(jù)處理。但是在實(shí)際的場(chǎng)景中,一個(gè)系統(tǒng)的業(yè)務(wù)邏輯沒(méi)有這么簡(jiǎn)單和單調(diào),它總是伴隨著更多的邏輯、更多的業(yè)務(wù)、更復(fù)雜的關(guān)聯(lián)關(guān)系。所有的數(shù)據(jù)都是保存在數(shù)據(jù)庫(kù)中(SQLSERVER、mysql、mongodb等),你把數(shù)據(jù)庫(kù)就理解為一個(gè)數(shù)據(jù)保存的文件系統(tǒng)就行了,它比我們普通的文件系統(tǒng)擁有更高的訪問(wèn)效率和性能、它有事務(wù)、它有鎖、它有自己的一套CRUD語(yǔ)句等特點(diǎn)。

? ? ? ? ?這里延伸一下,什么是事務(wù),什么是鎖,什么是CRUD。注意這里不照搬官方的定義,我只用白話和更簡(jiǎn)單地易于理解的描述讓大家有更好的認(rèn)識(shí)及理解。

事務(wù):做一連串有序的事情(或一個(gè)事情),當(dāng)其中一個(gè)出現(xiàn)異常時(shí),已經(jīng)被執(zhí)行的命令進(jìn)行回退還原。比如,你有ABCD4個(gè)事情加入到事務(wù)中,修改了A里面的一個(gè)原始值為1的值變?yōu)?,修改了B里面的一個(gè)原始值為2的值變?yōu)?,但是當(dāng)執(zhí)行C事情的時(shí)候,出現(xiàn)錯(cuò)誤,無(wú)法繼續(xù)執(zhí)行,則所有已經(jīng)在此事務(wù)中處理的全部回退還原。即:A中的值還原為1,B中的值還原為2.這種應(yīng)用場(chǎng)景在大型電商或者是嚴(yán)謹(jǐn)?shù)南到y(tǒng)中是必須保證數(shù)據(jù)正確的。否則出現(xiàn)數(shù)據(jù)方面的錯(cuò)誤,整個(gè)系統(tǒng)就無(wú)法正常工作了,后期產(chǎn)生的數(shù)據(jù)全部都是錯(cuò)的,系統(tǒng)就沒(méi)有生存的意義了。

鎖:有一堆人都想去使用同一輛小汽車(chē),他們從四面八方趕往停車(chē)場(chǎng)去使用這輛車(chē),必須有一個(gè)人先到先占有使用,這個(gè)人未使用完前,其他任何人是無(wú)法使用的,如果你想要使用,就等,等先到的那個(gè)人使用完畢后,你才能接著使用。同樣,下一個(gè)正在使用的人完全占據(jù)了此物的使用權(quán),其他人得接著等!開(kāi)始使用時(shí),相當(dāng)于是加鎖。使用完畢就是解鎖。只有解鎖了,其它人才有資格進(jìn)行使用、即再次加鎖。如果已經(jīng)加了鎖,其它人無(wú)法解鎖無(wú)法使用。

??CRUD:這個(gè)是數(shù)據(jù)庫(kù)方面常用語(yǔ)句的簡(jiǎn)稱(chēng)。create、read、update、delete的簡(jiǎn)稱(chēng)而已。read就是特指Select語(yǔ)句,屬于讀操作。

? ? ? ? 在進(jìn)行進(jìn)一步實(shí)戰(zhàn)之前,我們得先準(zhǔn)備好環(huán)境,得在你電腦上安裝好數(shù)據(jù)庫(kù),此實(shí)戰(zhàn)教程以微軟的Sqlserver為基礎(chǔ)進(jìn)行演示。

安裝教程網(wǎng)上一堆,這里就不一一演示及講解了。同學(xué)們自己搜索安裝使用,安裝過(guò)程中設(shè)置的密碼信息什么的,都記住即可。這里提供一個(gè)官網(wǎng)的下載地址:https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads

? ? ? ? 準(zhǔn)備好數(shù)據(jù)庫(kù)環(huán)境后,我們需要?jiǎng)?chuàng)建數(shù)據(jù)庫(kù)及表。這里說(shuō)一下,由于歷史及工作原因,我使用的是SQLSERVER 2008R2版本,你安裝的是最新版本也罷,老版本也罷,都大同不異。找到SSMS管理器,打開(kāi)如下:

服務(wù)器名稱(chēng)選擇local,輸入?你安裝過(guò)程配置的賬號(hào)及密碼,點(diǎn)擊連接,打開(kāi)數(shù)據(jù)庫(kù)。?

打開(kāi)后的頁(yè)面如下:可以看到?jīng)]有任何庫(kù)。

我們創(chuàng)建一個(gè)庫(kù),就叫做csdnStudy吧。

輸入數(shù)據(jù)庫(kù)名稱(chēng),點(diǎn)擊下面的確定按鈕

?在SSMS左側(cè),我們就可以看到我們新建的數(shù)據(jù)庫(kù),我們庫(kù)建好了,但是表完全是空的。下來(lái),我們繼續(xù)創(chuàng)建表。新建一個(gè)叫用csdnUser的表。

在表上右鍵,選擇新建表:依次為此表增加相應(yīng)的列名如下圖所示:所有列名的數(shù)據(jù)類(lèi)型最好與此教程中的保持一致,后期出現(xiàn)的錯(cuò)誤、優(yōu)化等,你都需要親身體驗(yàn)一下。

?這里你完全按照我們的初步設(shè)計(jì)來(lái)進(jìn)行就可以,雖然存在儲(chǔ)多不好的問(wèn)題,這都是我們后期要逐步從化的。比如字段注釋、表ID不能為空、字段占用長(zhǎng)度等等,這里我們統(tǒng)統(tǒng)都不考慮。

然后保存表,ctrl+s出現(xiàn)輸入表名的對(duì)話框,輸入表名csdnUser,點(diǎn)擊確定,表就新建好了。

好了。至此,我們的數(shù)據(jù)庫(kù)已經(jīng)準(zhǔn)備好了,現(xiàn)在我們打開(kāi)上一節(jié),我們創(chuàng)建的項(xiàng)目,進(jìn)行數(shù)據(jù)庫(kù)的連接及使用。

在解決方案上右鍵,依次選擇以下項(xiàng):

找到類(lèi)庫(kù)(.NET Framework)選中,點(diǎn)擊下一步:

輸入?項(xiàng)目名稱(chēng):DataProvider,點(diǎn)擊創(chuàng)建按鈕,這個(gè)項(xiàng)目我們就是專(zhuān)門(mén)用來(lái)進(jìn)行數(shù)據(jù)庫(kù)CRUD的項(xiàng)目。

再來(lái)看看我們的項(xiàng)目方案:

刪除其中默認(rèn)生成的?Class1.cs控制器。右鍵->刪除即可。

然后我們需要添加ADO.NET數(shù)據(jù)實(shí)體類(lèi)型來(lái)支持?jǐn)?shù)據(jù)庫(kù)的映射及訪問(wèn):

在彈出來(lái)的頁(yè)面中找到:ADO.NET實(shí)體數(shù)據(jù)類(lèi)型項(xiàng),點(diǎn)擊右下角的添加按鈕

選擇“來(lái)自數(shù)據(jù)庫(kù)的EF設(shè)計(jì)器”,點(diǎn)擊下一步:

如果你看到的是如下的界面,則點(diǎn)擊新建連接:

選擇數(shù)據(jù)源為:Mircrosoft SQL Server,因?yàn)槲覀兡壳笆褂玫拇_實(shí)是SQLSERVER進(jìn)行實(shí)戰(zhàn)演示,點(diǎn)擊繼續(xù)按鈕:

?這時(shí)正在檢索所有可用的已經(jīng)安裝SQLSERVER的PC,讓它檢索完成:選擇你的電腦,如果你不知道你的電腦名,則在你桌面上"我的電腦"->屬性中查看你的計(jì)算機(jī)名。

我們?cè)谙吕斜碇羞x擇自己的電腦:

?在"選擇或輸入數(shù)據(jù)庫(kù)名稱(chēng)(D)"項(xiàng)下拉選擇我們的數(shù)據(jù)庫(kù):csdnStudy,同時(shí)點(diǎn)擊左下角的"測(cè)試連接"按鈕進(jìn)行連接測(cè)試,看是否連接正常。

?可以看到,提示連接成功 ,說(shuō)明一切OK,點(diǎn)擊確定,測(cè)試連接成功的彈出框關(guān)閉,再點(diǎn)擊連接屬性對(duì)話框的確定,回到實(shí)體數(shù)據(jù)模型向?qū)ы?yè)面:如下兩圖所示

點(diǎn)擊下一步,我們繼續(xù):

啥也不要改,繼續(xù)點(diǎn)擊下一步:

確認(rèn)如下信息后,點(diǎn)擊完成按鈕。稍等片刻,等執(zhí)行完畢,你將可看到如下基架。你可以自己看看里面生成的文件骨架,這里先不進(jìn)行說(shuō)明。

現(xiàn)在我們來(lái)看看DataProvider項(xiàng)目下的Model.edmx文件,雙擊此文件,你看到的是什么?是不是如下頁(yè)面,懵逼了吧,我們的表呢?我們生成的模型呢?肯定是哪里出錯(cuò)了!

我們點(diǎn)擊"模型瀏覽器",注意觀察右側(cè)的變化,我們?cè)?、Model.edmx文件上右鍵,選擇"從數(shù)據(jù)庫(kù)更新模型",再更新一次,還是一樣的問(wèn)題,生成的模型呢?

還是沒(méi)有出現(xiàn),我們?cè)賮?lái)看看控制臺(tái)的輸出:

這就再明白不過(guò)了,我們?cè)O(shè)計(jì)的csdnUser表沒(méi)有主鍵?。∷?,這就要求我們養(yǎng)成一個(gè)習(xí)慣,任何表必須有主鍵!

此時(shí),我們?cè)倩剡^(guò)頭來(lái)打開(kāi)SSMS,在cdsnUser表上右鍵,選擇設(shè)計(jì),選擇id行,右鍵將其設(shè)置為主鍵!保存文件。

?設(shè)置成功后,看到主鍵是不允許為null的!

這時(shí),我們?cè)僭谶@里生成模型:

?你看,確實(shí)沒(méi)有生成,如果某個(gè)表已經(jīng)生成過(guò),這里是不再出現(xiàn)這個(gè)表名的。點(diǎn)擊以下頁(yè)面的完成,OK,你看看,是不是已經(jīng)變了。

這時(shí)再雙擊Model.edmx文件,你將能清楚看到通過(guò)數(shù)據(jù)庫(kù)生成的模型!?

再看看Model.tt下面也已經(jīng)正確自動(dòng)生成了表的數(shù)據(jù)模型。至此,模型的生成,已經(jīng)OK。

接下來(lái),我們添加對(duì)于模型的引用。在我們的WebApplication項(xiàng)目的引用目錄上右鍵,選擇"添加引用":

在項(xiàng)目子菜單中選擇解決方案,勾選右側(cè)DataProvider前的復(fù)選框,點(diǎn)擊右下角的確定按鈕,添加引用。

可以看到,已經(jīng)添加成功。

然后我們對(duì)DataProvider項(xiàng)目進(jìn)行重新生成

然后我們添加一個(gè)控制器,用來(lái)進(jìn)行我們的業(yè)務(wù)邏輯?

控制器名稱(chēng)輸入:UserController,點(diǎn)擊添加

控制器添加完成后,我們需要通過(guò)NuGet來(lái)安裝EF(EFentifyFramework)相關(guān)的依賴包,否則,下一步就會(huì)出現(xiàn)csdnStudyEntities出現(xiàn)警告。勇者下圖:依次選擇工具->NuGet包管理器(N)->程序包管理器控制臺(tái)

出現(xiàn)以下命令窗口:

?我們現(xiàn)在通過(guò)命令來(lái)安裝我們的EntityFramework 依賴:輸入命令:其中紅色的是固定的,你照著輸入就行。藍(lán)色為我們要替換的內(nèi)容,分別為項(xiàng)目名稱(chēng)及我們要安裝的版本。兩者都得正確,否則仍然后續(xù)步驟仍然存在問(wèn)題,無(wú)法繼續(xù)。項(xiàng)目名稱(chēng),就是我們的項(xiàng)目名稱(chēng),這個(gè)不用多說(shuō)。版本號(hào),如果你不知道,你可以在DataProvider項(xiàng)目下的packages.config中查看版本號(hào)。

Install-package EntityFramework -ProjectNameWebApplication -Version6.2.0

確認(rèn)輸入完成后,回車(chē)等待安裝完畢。因?yàn)槲乙呀?jīng)安裝過(guò),所以就不截圖說(shuō)明了,這一步,只要你輸入正確,不會(huì)有什么錯(cuò)誤,如果有錯(cuò)誤,你就檢查你的輸入是否正確。

現(xiàn)在我們?cè)赨serController控制器中實(shí)現(xiàn)一個(gè)Get方法,如下所示:注意添加DataProvider的引用,第一行所示。

然后運(yùn)行起來(lái),拼寫(xiě)正確的路由:

https://localhost:44378/api/User/

我們看看接口返回什么,呀吼,不出意外,你又一次遇到異常了!

根據(jù)這個(gè)提示再明白不過(guò)了,我們需要將EF生成的實(shí)體連接配置到我們WebApplication項(xiàng)目中!停止運(yùn)行項(xiàng)目,打開(kāi)DataProvide項(xiàng)目下面的App.Config文件,復(fù)制其中的connectionStrings節(jié)點(diǎn),如下紅框所示。

將其粘貼到WebApplication項(xiàng)目下的web.config文件中。

我們?cè)俅芜\(yùn)行起來(lái),沒(méi)有再報(bào)錯(cuò)了。同時(shí)看到接口返回了一個(gè)空的數(shù)組。為什么呢?因?yàn)槲覀冞@個(gè)表中確實(shí)沒(méi)有數(shù)據(jù)呀。。

我們現(xiàn)在在數(shù)據(jù)庫(kù)表中增加幾條數(shù)據(jù),再來(lái)執(zhí)行此接口,看返回的是什么。

輸入:insert into csdnUser ("id","name","sex") VALUES ('1265984563', 'Bill', 'f'),為指定的列設(shè)置數(shù)據(jù)。

全選當(dāng)前語(yǔ)句:點(diǎn)擊執(zhí)行。

再通過(guò)語(yǔ)句查一下數(shù)據(jù)庫(kù),看看數(shù)據(jù):

我們?cè)俅芜\(yùn)行項(xiàng)目,看看接口返回什么了。

OK,非常完美,數(shù)據(jù)庫(kù)表中的數(shù)據(jù),全部查出來(lái),并且通過(guò)接口正確返回??!限于篇幅,本節(jié)就到這里,下一節(jié),我們來(lái)改造此接口,讓接口返回更加輕量化的JSON數(shù)據(jù)。

第三講:接口返回json數(shù)據(jù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容