iT邦幫忙

2023 iThome 鐵人賽

DAY 7
0
SideProject30

30天挑戰:從無到有,使用Vue.js和.NET建立一個Web登入系統系列 第 7

Day 7:環境篇 - 如何將.NET專案與SQL Server資料庫做連接 (下)

  • 分享至 

  • xImage
  •  

本篇重點:

  1. 如何將.NET專案和SQL Server做連接
    • 該如何選擇連接方式
  2. 如何使用Database First的方式連接資料庫
    • 建立DbContext,將資料庫映射到專案上
    • 如何修正「Error: 0 - 此憑證鏈結是由不受信任的授權單位發出的」的錯誤
  3. 更改連線設定,將專案自動連接到資料庫
  4. 如何使用Code First的方式連接資料庫

昨天我們已經在SQL Server建立本次專案會使用到的資料庫&資料表(詳情請見:Day 6:環境篇 - 如何將.NET專案與SQL Server資料庫做連接 (上)),那今天就來講一下怎麼將.NET專案和SQL Server做連接吧!

1. 如何將.NET專案和SQL Server做連接

我們有兩種方式可以將.NET專案和SQL Server做連接,分別是「Database First」和「Code First」,其差異如下:

  • Database First:在資料庫中先建立資料庫結構,包括資料表、欄位類型、關聯等。然後,使用ORM(對象關聯映射)框架(如Entity Framework Core),逆向工程從現有的資料庫中生成對應的「資料模型類別(通常稱為DbContext)」。這些自動生成的DbContext將反映資料庫結構,使開發人員能夠使用它們來執行資料庫操作
  • Code First:在程式碼中,先定義資料模型,再使用.NET語言(如C#)中的類別來表示資料表、欄位、以及資料表之間的關聯。然後,透過ORM(對象關聯映射)框架,將這些資料模型映射到資料表結構。透過遷移工具等工具,可以自動生成或更新資料庫結構,以與程式碼中定義的模型保持一致

那該如何選擇連接方式呢

如果你今天已經定義好一個資料庫,就可以使用「Database First」,因為它允許你使用現有的資料庫結構來生成資料模型(DbContext)

相反的,如果你今天剛拿到一個新案子,在專案裡已經有DbContext和其他的資料表結構,那你就可以使用「Code First」,因為你的資料庫裡並沒有這個專案會使用到的資料表,所以必須透過「Code First」的方式將DbContext映射到資料庫

那接下來,就來看一下該如何使用這兩種方式做連接吧


2. 如何使用Database First的方式連接資料庫

我們現在要先將專案和資料庫做連接,再將資料庫結構建立成DbContext

首先,我們需要先在專案中安裝SQL Server的相關套件,到.NET專案點擊右鍵,選擇「管理NuGet套件(N)」
https://ithelp.ithome.com.tw/upload/images/20230922/201410881PGjBi67tl.png

要安裝的套件如下:

  • Microsoft.EntityFrameworkCore.Tools
  • Microsoft.EntityFrameworkCore.SqlServer

https://ithelp.ithome.com.tw/upload/images/20230922/20141088hYePdhqN8S.png
https://ithelp.ithome.com.tw/upload/images/20230922/20141088Nx7pO7jEt4.png

安裝完成後,到「檢視(V)>其他視窗」選擇「套件管理器主控台(O)」,就會在下方跳出PM>開頭的終端機
https://ithelp.ithome.com.tw/upload/images/20230922/201410881f5tTQgl5E.png

建立DbContext,將資料庫映射到專案上

在首次創建DbContext時,需要執行以下指令

# 建立DbContext的基本語法,需整段複製,更改完再丟去「套件管理器主控台」執行
Scaffold-DbContext "Server=<資料庫的IP位置>;Database=<資料庫名稱>;User=<資料庫的使用者名稱>;Password=<資料庫使用者密碼>;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models

那如果套用在我現在這個範例上,我的指令會長成這樣:

Scaffold-DbContext "Server=.;Database=VueNet;User=sa;Password=!Salogin1;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models

將這行指令貼到「套件管理器主控台」做執行,開始建立DbContext
https://ithelp.ithome.com.tw/upload/images/20230922/20141088iLvFPkl8C1.png

如何修正「Error: 0 - 此憑證鏈結是由不受信任的授權單位發出的」的錯誤

沒意外的話,當你執行完「建立DbContext的指令」,就會看到它報這個錯誤
https://ithelp.ithome.com.tw/upload/images/20230922/20141088ntQpqO0p35.png

這是因為我們現在傳送給SQL Server的憑證是不被信任的,只要在指令中加上TrustServerCertificate=true;就可以解決了

新增後的完整程式碼如下:

Scaffold-DbContext "Server=.;Database=VueNet;User=sa;Password=!Salogin1;Trusted_Connection=True;TrustServerCertificate=true;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models

成功建立DbContext之畫面:
https://ithelp.ithome.com.tw/upload/images/20230922/20141088EP4DPz9S2D.png

如果它出現Build failed.,表示你專案有地方報錯,可以到錯誤清單查找問題
https://ithelp.ithome.com.tw/upload/images/20230923/20141088VhGgpwWXT9.png
https://ithelp.ithome.com.tw/upload/images/20230923/20141088eJAckBvu6x.png

執行完,會看到專案裡多一個Models的資料夾,底下放著我們的「DbContext」和「資料表結構檔」,它會根據我們的「資料庫&資料表名稱」自動做命名
https://ithelp.ithome.com.tw/upload/images/20230922/20141088H6Ova6SI5i.png

3. 使用連接字串,將專案自動連接到資料庫

為了不要每次更新資料庫都要執行這個指令,重新做建立DbContext,我們可以更改連線設定,並寫在appsettings.jsonProgram.cs底下(官方文檔:Microsoft - 連接字串

順便來說一下這兩個檔案是在幹嘛的

  • appsettings.json:用於配置應用程式的 JSON 格式配置檔案。它可以包含各種應用程式設定,例如資料庫連接字串、服務設定、日誌記錄設定等
  • Program.cs:是.NET Core應用程式的入口點(跟index.js是一樣的概念)。它包含了 Main 方法,用於控制應用程式的執行流程

既然介紹完這兩個檔案,那我們就來說明如何更改連線設定吧!

更改VueNetContext.cs

VueNetContext.cs打開
https://ithelp.ithome.com.tw/upload/images/20230923/20141088VYlT5nuxAe.png

第21、22行的Code是原先的連線方式,現在直接將這兩行刪掉
https://ithelp.ithome.com.tw/upload/images/20230922/20141088mqVNZEQbZX.png

並在第20行後加上大括號{ },不然它會報錯
https://ithelp.ithome.com.tw/upload/images/20230922/201410884sM3kScBHD.png

更改appsettings.json

appsettings.json打開
https://ithelp.ithome.com.tw/upload/images/20230922/20141088HasUXaGT36.png

將下方程式碼貼到"AllowedHosts": "*"下方(記得在"AllowedHosts": "*"左邊加上逗點,不然會報錯),這行就是你上面建立DbContext時的設定,只是現在用GetConnectionString的方式取得連接資料庫的字串而已

"ConnectionStrings": {
    "DefualtDatabase": "Server=.;Database=VueNet;User=sa;Password=!Salogin1;Trusted_Connection=True;TrustServerCertificate=true;"
}

更改完之appsettings.json畫面:
https://ithelp.ithome.com.tw/upload/images/20230922/20141088VZVyICy3Oo.png

更改Program.cs

Program.cs打開
https://ithelp.ithome.com.tw/upload/images/20230922/20141088tccf8zdcDP.png

因為我們要在建置前做好連接,所以要將下方程式碼貼到第15行:var app = builder.Build();的上方

// GetConnectionString()裡的值會根據你剛剛在appsettings.json的ConnectionStrings裡設定的值,所以這邊你也可以自行做設定
builder.Services.AddDbContext<VueNetContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("DefualtDatabase")));

更改完之Program.cs畫面:
https://ithelp.ithome.com.tw/upload/images/20230923/20141088LVsUDefaNL.png

如果你是使用官方文檔(Microsoft - 連接字串)提供的程式碼,記得跟著以下GIF做更改,否則會報錯喔!

如果都更改完了,按「開始」測試看看專案能不能成功運行,如果運行成功,沒有報錯,就代表你有成功和資料庫做連線
https://ithelp.ithome.com.tw/upload/images/20230922/20141088eeeYFVoj82.png

4. 如何使用Code First的方式連接資料庫

如果你有照著上面的方式,使用連接字串的方式將專案自動連接到資料庫,那你接下來只需要更改「VueNetContext.cs」和「UserProfile.cs」這兩個檔案,再輸入指令,將資料模型定義的表&欄位建立在SQL Server上就可以了

更改VueNetContext.cs

先將VueNetContext.cs打開
https://ithelp.ithome.com.tw/upload/images/20230923/20141088gQgTiZJJn8.png

第24行到第38行是原先配置DbContext的程式碼,現在我們將它刪除

更改UserProfile.cs

UserProfile.cs打開
https://ithelp.ithome.com.tw/upload/images/20230923/20141088jEUdQYHJyk.png

這個檔案是我們在.NET中設定資料表的資料模型,所以在public partial class UserProfile{...}前面加上[Table("UserProfile")],定義資料表的名稱

Day 6:環境篇 - 如何將.NET專案與SQL Server資料庫做連接 (上)裡有提到,我們在ID這個欄位有用一個生成「自動遞增數值」的屬性,叫Identity,那我們在.NET中的資料模型,一樣可以使用它,只是寫法就變成.NET的格式[DatabaseGenerated(DatabaseGeneratedOption.Identity)],而[MaxLength(100)]則是定義欄位的資料長度,這邊依序指定即可。至於主KEY的部分,.NET預設會將名稱是ID的欄位設為主KEY,所以我們不用額外撰寫
https://ithelp.ithome.com.tw/upload/images/20230923/20141088N2qsz4YvWT.png

並在CreatedAt和UpdatedAt加上_,這樣才符合我們Day 6命名的欄位名稱

都改好後,將我們原先新增在SQL Server的「UserProfile」資料表刪除
https://ithelp.ithome.com.tw/upload/images/20230923/20141088pmVFhD4Qvw.png

在「套件管理主控台」,輸入Add-Migration,它是Entity Framework(EF)提供的一個指令,執行時會分析你的資料模型做了哪些變更,並和資料庫做對照,再自動建立一個新的遷移文件(Migration)

這個文件包括了要對資料庫進行變更的描述,讓你在不同版本之間能正確地操作和更新資料庫。你可以把它想成是GIT,因為每一次執行時,都會叫你輸入一個Name的參數,而這個Name通常會打上「你變更了什麼」,這樣才能更好的去識別&管理。那因為我們剛剛變更的是UserProfile這張表,所以我Name參數就會輸入modify UserProfile
https://ithelp.ithome.com.tw/upload/images/20230923/20141088aos22fvlWw.png

執行完,會看到專案裡多了一個Migrations的資料夾,底下放著自動生成的遷移文件,而檔案名稱後面則是我們剛剛在Name參數輸入的值
https://ithelp.ithome.com.tw/upload/images/20230923/201410884gvI2dF5Lg.png

可以看到遷移文件裡,寫的是我們剛剛設定UserProfile的欄位
https://ithelp.ithome.com.tw/upload/images/20230923/20141088L9vSyAhwoj.png

再輸入Update-Database,將我們變更的設定更新到資料庫
https://ithelp.ithome.com.tw/upload/images/20230923/20141088XKCoAu2IGy.png

那我們現在到SQL Server看UserProfile這張表有沒有建立成功,記得先將資料庫重新整理一下
https://ithelp.ithome.com.tw/upload/images/20230923/20141088qgdErgmTf0.png

就會看到它被新增回來囉!
https://ithelp.ithome.com.tw/upload/images/20230923/20141088Y8u0xMPLzy.png

你也可以對它點擊右鍵,選擇「設計(G)」,看是不是跟我們當初設計的資料格式一樣
https://ithelp.ithome.com.tw/upload/images/20230923/20141088t8EyOacDMF.png

至於你會看到它多了一個名叫 __EFMigrationsHistory 的資料表,它是用於記錄「Add-Migration」時的遷移版本和歷史紀錄

如果在操作上有任何問題,都歡迎在下方留言提出喔!


上一篇
Day 6:環境篇 - 如何將.NET專案與SQL Server資料庫做連接 (上)
下一篇
Day 8:.NET概念篇 - RESTful API是什麼?
系列文
30天挑戰:從無到有,使用Vue.js和.NET建立一個Web登入系統19
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言