2023年11月2日 星期四

EF Core CodeFirst

日常中有機會維護到 entity framework 的專案,也僅限於皮毛,而 ef core 也發展了一段時間,而對應的使用

情境似乎也越來越完善,分幾個項目稍微了解一下



測試環境 .Net 7、Rider Console 專案

建立 Console 專案後,使用 nuget 安裝套件Microsoft.EntityFrameworkCore.SqlServer、

Microsoft.EntityFrameworkCore.Tools ,須注意兩者皆安穩定版 7.0.9 的版本


接著準備建立 Entities,這邊建立一個 Person 類別,其中有使用 DataAnnotations 在properties 上掛上 Attr,

記得要 using System.ComponentModel.DataAnnotations; 這邊的類別對應著資料庫的 Table



再來建立 TestDbContext 類別,主要用於存取相關資料表,而類別名稱最好對應到 DB 的名稱,且後綴詞為

Context,這類別會繼承 DbContext,後續會加入property 來對應 Person 類別,還會複寫 OnConfiguring() 方法,

並且設定資料庫連線,而資料庫的連線後續會修改為讀取設定檔的




記得 OnConfiguring() 方法中的連線字串與 Property DbSet<> 記得要寫


接著使用DotNet CLI 指令操作,可以透過安裝NET SDK 安裝即可,亦可透過 dotnet –version 指令確認版本


若已經有安裝 dotnet cli,但是需要更新到版本可以使用以下指令

dotnet tool update - Updates


再安裝 EF Core 命令列工具(dotnet ef 不再包含於 .NET Core SDK 裡須額外安裝),安裝指令為

dotnet tool install --global dotnet-ef



若已經安裝過 dotnet ef ,若想要升級版本的話,可以使用

dotnet tool update --global dotnet-ef


安裝 ef tool 後,可以使用 dotnet ef 來看目前本機版本



接著輸入 dotnet ef migrations add InitialCreate 指令來建立快照(若是用 PowerShell 可使用

Add-Migration InitialCreate)


Visual Studio 可在 Nuget Console 輸入


完成後,專案目錄會自動建立 Migrations 資料夾,並且有剛剛的InitialCreate.cs 與Snapshot.cs 檔案,

其中 InitialCreate.cs 底下還有 .Designer.cs 檔案



觀察 Snapshot.cs 檔案,內容為快照的設定


觀察InitialCreate.cs 檔案,內容為Migrations 的細節設定,Up()方法記載更至資料庫新增資料表 Person 的語法,

Down()方法紀載刪除資料表


接著使用 dotnet 指令 dotnet ef database update(若是PM 則使用Update-Database),其中會自動

自動執行唯一的 migration 檔案,若有多個則需要指定欲更新的檔案


執行完後,檢視資料庫

如下圖可以看到剛 Persons 資料被建立了,並且Schema相關設計也跟 Entity 設定的一樣,

其中,資料表會自動加入「s」,而__EFMigrationsHistory 資料表記錄著 Migrations 的歷程




若此時 Person 資料表需要新增欄位 Age 可以怎麼做?

首先同樣來到 Person Entity 檔案,新增 Age property



接著使用 dotnet 指令 dotnet ef migrations add PersonUp(若是PM:Add-Migration PersonUp)


執行後,專案檔會出現對應的 migration 檔案


緊接著來執行更新資料庫的命令,並且指定檔案

dotnet ef database update 20230727074703_PersonUp(若是PM:Update-Database 20230727074703_PersonUp)



前面提到的,通常會將DbContext的資料庫連線字串從設定檔指定可以怎麼做


首先新增 appsettings.json 檔案




將檔案屬性設成總是複製到輸出目錄



nuget 加入 Microsoft.Extensions.Configuration.Json


接著修改 TestDbContext.cs 檔案的 OnConfiguring() 方法

再來到 program.cs 檔案,使用 TestDbContext 物件來取得資料


以上打好收工


【參考】

沒有留言:

張貼留言