2-1.ASP.NET Core Web API 入門教學 - 資料庫連線設定 Database First,Scaffold-DbContext Build Failed解決方式

ASP.NET Core Web API 入門教學

影片講解(有字幕)


ASP.NET Core Web API 入門教學(2_1_補充) - 資料庫連線設定 Database First(VS2022&.NET6)

才剛開始就要教資料庫連線?會不會太進階?

很多教學上,為避免太複雜,所以在一開始都會用"模擬資料"來模擬存取資料,但我覺得新手時期很容易混淆,新手分不清那些部分是你在做模擬,哪些是你實際上要教的,往往學到最後才恍然大悟,當初為什麼要寫一堆,原來那只是在模擬阿~~~

而接下來的教學基本上都會跟資料庫緊密溝通,所以我會先教如何連線資料庫,並直接使用實際的連線方式進行資料存取。

那在Core這邊,會優先使用Entity Framework Core來進行資料庫的連線操作,而使用方式則有以下兩種:

  1. Database First:本課程的所使用的方法,先在SQL Server上(或其他資料庫)建立好資料庫與表格欄位,再到visual studio這邊下建立資料庫物件指令,則會在專案中產生相關對應的資料庫程式檔。
  2. Code First:直接在專案中,以程式的方式撰寫出所需的資料庫與表格欄位,然後再下相關指令,就會將你程式碼所寫的內容,逆向的到SQL Server上(或其他資料庫)建立好對應的資料庫與表格欄位。

但我個人實務上都是用Database First,Code First在正式環境上暫時還想不到使用的情境跟好處。有興趣的人可以自行Google這部分,也歡迎提供Code First的一些使用情境。

那首先要使用Database First,需要先安裝以下二個套件:

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

以前版本還要自行安裝下面兩個,不過現在安裝Microsoft.EntityFrameworkCore.SqlServer,就順便包含下面這兩個了。

  • Microsoft.EntityFrameworkCore
  • Microsoft.EntityFrameworkCore.Design

到方案總管的相依性>套件>管理NuGet套件

到上圖的導覽搜尋上面幾個套件然後進行安裝

到套件管理器主控台(檢視>其他視窗>套件管理器主控台)下以下指令

Scaffold-DbContext "Server=伺服器位置;Database=資料庫;User ID=帳號;Password=密碼" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -Force

有四個地方要自行調整:

  1. 伺服器位置:打上你的ip位置。
  2. 資料庫:你的資料庫名稱。
  3. 帳號:就帳號。
  4. 密碼:就密碼。

如果出現此憑證鏈結是由不受信任的授權單位發出的可以在連線字串裡多加一個參數TrustServerCertificate=true

"Server=伺服器位置;Database=資料庫;User ID=帳號;Password=密碼;TrustServerCertificate=true"

其中-OutputDir Models指說要將相關檔案產生在這個資料夾底下,-Force則是如果此位置已有相同檔案時覆蓋,就算沒檔案也可以多這個參數。其他指令部分可以參考這裡:這裡

執行完後如下圖,且產生出Models資料夾與相關檔案。

在產生出的這個檔TodoContext.cs會出現一個警告

#warning To protect potentially sensitive information in your connection string, you should move it out of source code. You can avoid scaffolding the connection string by using the Name= syntax to read it from configuration - see https://go.microsoft.com/fwlink/?linkid=2131148. For more guidance on storing connection strings, see http://go.microsoft.com/fwlink/?LinkId=723263.

上面有建議事項,那我們就依照網址內容的建議進行修改。

將原本寫在TodoContext.cs的連線字串移到appsettings.json

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "TodoDatabase": "Server=伺服器位置;Database=資料庫;Trusted_Connection=True;User ID=帳號;Password=密碼"
  }
}

然後我們在Startup.cs中加入資料庫物件的DI注入(這以後會講,這邊先這樣照做)。

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();
    services.AddDbContext<TodoContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("TodoDatabase")));
}

其中Configuration.GetConnectionString("TodoDatabase")可以從appsettings.json中抓出"TodoDatabase:"後面的內容,這部分就是說,請把一些參數的東西寫在appsettings.json裡,然後再用Configuration.GetConnectionString去抓取,而不要直接把連線字串寫死在程式裡,在日後維護或安全的考量上會較為良好。

那日後如果在SQL Server上有資料表行進新增或更新時,只要在重下一次Scaffold-DbContext指令即可。那其中要特別注意的是,在下Scaffold-DbContext指令時,程式不能存有任何編譯上的錯誤,否則將會失敗,如圖。

以上就是今天資料庫連線的前置作業教學。想要聽多一些廢話的可以看影片

新手分享學習成果,若有錯誤,煩請告知修正,感謝🙏

參考資料:

Visual Studio 中的 Entity Framework Core 工具參考-封裝管理員主控台
連接字串
Install Entity Framework Core
Creating a Model for an Existing Database in Entity Framework Core




Copyright © 凱哥寫程式 2022 | Powered by TalllKai ❤