Test EntityFramework Core Code First Add-Migration
根據https://learn.microsoft.com/zh-tw/aspnet/core/tutorials/razor-pages/model?view=aspnetcore-7.0&tabs=visual-studio
模擬MVC架構下,實作code first 建立資料表及新增資料表欄位
1.新增資料模型
在Models資料夾按右鍵 → 新增→ 類別。將類別命名為[模型名稱]
2.在功能表 → 工具 → NuGet套件管理員 → 套件管理器主控台下指令,下載Nuget套件:
Install-Package Microsoft.EntityFrameworkCore.Design
Install-Package Microsoft.EntityFrameworkCore.SqlServer
3.在Controllers資料夾按右鍵 → 加入 → 新增Scaffold項目 → 使用EntityFramework執行檢視的MVC控制器
模型類別 選擇步驟1.建立的模型
資料內容類別按 + 號 新增資料內容類型
預設命名[專案名稱].Data.[專案名稱Context]
測試階段重新命名[專案名稱].Data.[模型名稱Context]
控制器名稱 測試階段與步驟1.模型名稱一致[模型名稱Controller]
4.在views資料夾按右鍵 → 加入 → 新增Scaffold項目 → 使用 Entity Framework(CRUD)的Razor頁面
模型類別 選擇步驟1.建立的模型
資料內容類別按 + 號 新增資料內容類型
預設命名[專案名稱].Data.[專案名稱Context]
####整個專案都使用同一個連線的話 這裡不要更改,可能會造成Add-Migration時,找錯或找不到正確的Context,(自作聰明更動它修好久QQ)
5.改appsettings.json連線字串 "ConnectionStrings": {"連線字串KEY":"連線字串VALUE"}
連線字串KEY 同步驟3和4 的[資料內容類別]
連線字串VALUE
預設 "Server=(localdb)\\mssqllocaldb;Database=[專案名稱].Data;Trusted_Connection=True;MultipleActiveResultSets=true",
這裡預設指向mssqllocaldb 這個資料庫不是sqlserver
幾乎全改 "Server=localhost;Database=TestDb;User=[User];Password=[Password];TrustServerCertificate=true"
加入帳號密碼須加上TrustServerCertificate=true; 使用加密連線
6.在功能表 → 工具 → NuGet套件管理員 → 套件管理器主控台下指令
Add-Migration InitialCreate
Update-Database
Add-Migration 指令會產生程式碼來建立初始資料庫結構描述。 資料庫結構是以 指定的 DbContext 模型為基礎。 [InitialCreate] 變數用來命名移轉。
您可以使用任何名稱,但依照慣例會用描述移轉的名稱。
Update-Database 會在 Up 尚未套用的移轉中執行 方法。
Update-Database命令會在專案資料夾 → Migrations/<time-stamp>_InitialCreate.cs 執行 Up 方法,以建立資料庫。
會自動以<時間戳>_[命名移轉檔案的任意名稱].cs 來命名
在資料庫,EntityFramework 會同時建立一個 "__MigrationHistory" 資料表,同時在裡面寫入了一筆記錄。20230523023622_InitialCreate 7.0.5
資料表欄位 MigrationId 就是 EntityFramework 在 專案/Migrations 資料夾之下建立的 .cs 檔案名稱。
資料表欄位 ProductVersion 是專案使用的SDK版本,####如果Add-Migration 使用較舊的 SDK版本,可能會產生錯誤訊息
####如果你忘記指令的正確拚法,你可以僅輸入前幾個字元,然後按下 <TAB> 鍵,就會出現提示視窗讓你選擇正確的指令。
7.新增欄位移轉
7.1[屬性欄位]新增至模型
7.2編輯 Views/[模型名稱]/Index.cshtml ,並新增 [屬性欄位]
7.3使用 [屬性欄位]更新下列頁面:
Views/[模型名稱]/Create.cshtml。
Views/[模型名稱]/Delete.cshtml。
Views/[模型名稱]/Details.cshtml。
Views/[模型名稱]/Edit.cshtml。
####目前為止 更新的Model[模型類別]與資料庫的Table[資料表架構]不同。
7.4使用 Code First 移轉來更新資料庫結構描述
功能表 → 工具 → NuGet套件管理員 → 套件管理器主控台下指令
Add-Migration [命名移轉檔案的任意名稱]
Update-Database
8.啟動 Migration(這指令適用Core 5,Core 6 不須手動啟動):在功能表 → 工具 → NuGet套件管理員 → 套件管理器主控台下指令
Enable-Migration
此命令會將 Migrations 資料夾新增至專案。 這個新資料夾包含兩個檔案:
▲組態類別 Configuation.cs。這個類別可讓您設定移轉對內容的運作方式。 在此逐步解說中,我們將只使用預設組態。 「由於專案中只有一個單一 Code First 內容,因此 Enable-Migrations 已自動填入此組態適用的內容類型。」
▲InitialCreate 移轉。 產生此移轉是因為在我們啟用移轉之前,Code First 已為我們建立了資料庫。
這個包含 scaffold 移轉中的程式碼,表示已在資料庫中建立的物件。是包含資料欄位的資料表。 檔案名稱包含時間戳記,以協助排序。
「如果尚未建立資料庫,則不會將此 InitialCreate 移轉新增至專案中。 反之,在我們第一次呼叫 Add-Migration 時,建立這些資料表的程式碼將會建立至新的移轉中。」
9.列出歷史 Migration:在功能表 → 工具 → NuGet套件管理員 → 套件管理器主控台下指令
Get-Migration
10.恢復成指定版本 Migration:在功能表 → 工具 → NuGet套件管理員 → 套件管理器主控台下指令
Update-Database [從上個步驟所列的版本中指定版本] ex: update-database 20230524071104_updateColumnDataType
同時把[指定版本]之後的 Migration 復原
Migration 動作必須與你的資料模型符合。
Migration 不能與資料庫中的資料衝突
11.Fluent API
舊版(.Net Core5.0)寫在 Migrations/Configuation.cs
新版(.Net Core6.0)寫在專案/Data資料夾/DbContext相關類別檔內
namespace TestEFCoreCodeFirst.Data
{
public class CategoryContext : DbContext
{
public CategoryContext(DbContextOptions<CategoryContext> options)
: base(options)
{
}
/// <summary>
/// 覆寫 OnModelCreating 方法,並使用 Fluent API 來設定模型
/// </summary>
/// <param name="modelBuilder"></param>
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
//Fluent API configurations
modelBuilder.Entity<Category>()
.Property(b => b.CategoryName)
.IsRequired();
modelBuilder.Entity<Category>()
.Property(d1 => d1.Description1).HasMaxLength(1234);
modelBuilder.Entity<Category>()
.Property(d2 => d2.Description1).HasMaxLength(2345);
}
public DbSet<TestEFCodeFirst.Models.Category> Category { get; set; } = default!;
}
}
11.指定不同的連線字串:在功能表 → 工具 → NuGet套件管理員 → 套件管理器主控台下指令
Add-Migration [命名移轉檔案的任意名稱] -context [DbContext_ToBeUsed]