才剛開始就要教資料庫連線?會不會太進階?
很多教學上,為避免太複雜,所以在一開始都會用"模擬資料"來模擬存取資料,但我覺得新手時期很容易混淆,新手分不清那些部分是你在做模擬,哪些是你實際上要教的,往往學到最後才恍然大悟,當初為什麼要寫一堆,原來那只是在模擬阿~~~
而接下來的教學基本上都會跟資料庫緊密溝通,所以我會先教如何連線資料庫,並直接使用實際的連線方式進行資料存取。
本課程使用SQL Server當作資料庫,如果要跟著課程做但不會的,這邊有基本教學SQL Server安裝教學及設定TCP/IP教學和SQL Server Management Studio基本操作
那在Core這邊,會優先使用Entity Framework Core來進行資料庫的連線操作,而使用方式則有以下兩種:
- Database First:先在SQL Server上(或其他資料庫)建立好資料庫與表格欄位,再到visual studio這邊下建立資料庫物件指令,則會在專案中產生相關對應的資料庫程式檔。
- Code First:直接在專案中,以程式的方式撰寫出所需的資料庫與表格欄位,然後再下相關指令,就會將你程式碼所寫的內容,逆向的到SQL Server上(或其他資料庫)建立好對應的資料庫與表格欄位。
那首先要使用Database First,需要先安裝以下二個套件:
- Microsoft.EntityFrameworkCore.SqlServer
- Microsoft.EntityFrameworkCore.Tools
到方案總管的相依性>套件>管理NuGet套件
到上圖的導覽搜尋上面幾個套件然後進行安裝
到套件管理器主控台(檢視>其他視窗>套件管理器主控台)下以下指令
Scaffold-DbContext "Server=伺服器位置;Database=資料庫;User ID=帳號;Password=密碼;TrustServerCertificate=true" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -Force
有四個地方要自行調整:
- 伺服器位置:打上你的ip位置。
- 資料庫:你的資料庫名稱。
- 帳號:就帳號。
- 密碼:就密碼。
其中-OutputDir Models
指說要將相關檔案產生在這個資料夾底下,-Force
則是如果此位置已有相同檔案時覆蓋,就算沒檔案也可以多這個參數。
如果出現此憑證鏈結是由不受信任的授權單位發出的可以在連線字串裡多加一個參數TrustServerCertificate=true
那我個人喜歡帶的參數如下
Scaffold-DbContext "Server=127.0.0.1;Database=Kcg;User ID=Kcg;Password=123456;TrustServerCertificate=true" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -NoOnConfiguring -UseDatabaseNames -NoPluralize -Force
幾個參數解釋
TrustServerCertificate=true:信任伺服器憑證
-OutputDir Models:將檔案輸出到Models資料夾
-NoOnConfiguring:DbContext不要產生OnConfiguring片段,影片會大概解釋是什麼
-UseDatabaseNames:使用跟資料庫一樣的大小寫命名,不然可能大小寫會被改成別的風格
-NoPluralize:不要加複數s,不然會幫你在命名結尾上加上s
其他指令部分可以參考這裡:這裡
執行完後如下圖,且產生出Models資料夾與相關檔案。
接著我們將資料庫的連線字串寫在appsettings.json
中
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"KcgDatabase": "Server=127.0.0.1;Database=Kcg;User ID=Kcg;Password=123456;TrustServerCertificate=true"
}
}
然後我們在Program.cs
中加入資料庫物件的DI注入(這以後會講,這邊先這樣照做)。
builder.Services.AddDbContext<WebContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("KcgDatabase")));
其中Configuration.GetConnectionString("KcgDatabase")
可以從appsettings.json
中抓出"WebDatabase:"後面的內容,這部分就是說,請把一些參數的東西寫在appsettings.json
裡,然後再用Configuration.GetConnectionString
去抓取,而不要直接把連線字串寫死在程式裡,在日後維護或安全的考量上會較為良好。
那日後如果在SQL Server上有資料表行進新增或更新時,只要在重下一次Scaffold-DbContext
指令即可。那其中要特別注意的是,在下Scaffold-DbContext
指令時,程式不能存有任何編譯上的錯誤,否則將會失敗,如圖。
以上就是資料庫連線的前置作業,接著我們就要來實際測試剛剛的設定到底有沒有成功。
那由於我們資料庫中沒有任何資料,所以先在資料表TOPMenu中隨意新增一筆資料
接著到HomeController.cs中寫下以下程式
private readonly KcgContext _kcgContext; //先在全域宣告資料庫物件
public HomeController(KcgContext kcgContext) //這邊是依賴注入使用我們剛設定好的資料庫物件的寫法
{
_kcgContext = kcgContext;
}
如果之前有寫過C#跟資料庫連線但沒用過依賴注入的人,可能會覺得很特殊,以前使用宣告資料庫可能會是這樣寫的
using (var _kcgContext = new KcgContext())
{
}
但這要自己管理好生命週期,且更有新手可能連using都不會用,因而時不時有人就踩坑讓系統爆炸
現在用的這種叫依賴注入的寫法,由程式自動幫你管理好生命週期,你儘管用不需要擔心會採什麼坑
所以既然都來到的.NET Core時代,就改用依賴注入的寫法吧
為什麼我特別這麼說,因為發現還是很多人都轉來.NET Core了,還是放不下以前的寫法,其實這並沒有很難
最後我們在這邊簡單寫一下回傳TOPMenu資料表的資料,如下
public string Index()
{
return _kcgContext.TOPMenu.FirstOrDefault().Name;
}
存個檔後,我們就可以取回剛剛我們在資料庫新增的那筆資料的內容
按下啟動不偵錯查看結果
可以看到網頁上就有"取資料"三個字被我們從資料庫撈出來了
以上就是從資料庫撈資料的事前設定
跟在Controller中要如何使用資料庫物件撈取資料
參考資料:
Visual Studio 中的 Entity Framework Core 工具參考-封裝管理員主控台
連接字串
Install Entity Framework Core
Creating a Model for an Existing Database in Entity Framework Core