EF9 Code First 試用紀錄
EF9, SQL Server, PostgreSQL, Code First,
§ 引言
基於在 Azure Cloud 雲端專案經驗,使用 PostgreSQL 資料庫為必需且是基本能力(因為比較便宜)。
本人資料庫經驗90%都在 SQL Server。與 PostgreSQL 相處後發現差異比預期大如斷涯。連 data type 命名與基本行為都不一樣。Orz。
想在有限時間內存取 PostgreSQL 又不想花時間從基礎開始,考慮後的方案:
用 EF9+ 的 Code First 機制建立 tables。
用 EF Core 的 ORM 機制讀寫 tables。
PostgreSQL 進階的操作相信在 SQL Server 也都有,就請 AI 幫忙囉。
DB schema migration 就用 EF Tools 部署。
§ 目標
一、利用 EF 取存 PostgreSQL。減少 PostgreSQL 學習時間。 二、利用 Code First 看能否在 SQL Server 與 PostgreSQL 間隨心情移轉。
§ 心得
這次練習目標之一,利用 EF 取存 PostgreSQL 有達成目標。
目標之二隨意移轉 SQL Server 與 PostgreSQL 在現實上很骨感。理論上可行也確實有人做到但實作成本很高。 因為 SQL Server 與 PostgreSQL 實質相容性很低不可能隨意移轉。 且 EF 在 table entity 的通用宣示很基本根本不夠。
§ 結論
想利用 Code First 在多種資料庫隨意移轉是成本奇高不建議的。
在初期方向探索階段是可以用 Code First 嘗試不同目標資料庫,然仍應儘早決定,決定後就不該隨意變更,越到後期變更成本越高。
若是暨有資料庫走 database first ( update schema from database),調整後再 migration 到目標資料庫。這是下一篇文章的練習內容。利用 EF tools 執行 update 與 migration。
EF 最大價值之一是:程式碼即文件。
code first → migration → update → migration → update → migration ...
或
database firs → migration → update → migration → update → migration ...§ Code Fisrt 三步驟
預先建立目標資料庫,並拿到連線字串。
安裝套件
初次分析與宣告初版 entities
執行 EnsureCreated() 建立 entities。
依開發狀況加入 DataAnnotation 階段性精進。
必要的話,加入DB專用能力。
回到步驟 4 進入下一輪迭代。直到滿足需求。
專案第二期建議用 Database First 取得 schema 再依新需求精進。
Code First 比較適合全新專案的方向探索。
§ 實作環境
平台: NET8
DB1: SQL Server 2022
DB2: PosgtreSQL Server 17
IDE: Visual Studio 2022
框架: ASP.NET Core Web API
§ 開發關鍵紀錄 - 安裝套件
此練習只需針對目標 DB 安裝1個套件。
// for SQL Server
"Microsoft.EntityFrameworkCore.SqlServer" Version="9.0.9"
// for PostgreSQL
"Npgsql.EntityFrameworkCore.PostgreSQL" Version="9.0.4"§ 開發關鍵紀錄 - 部署指令
部署關鍵指令:EnsureCreated()
...
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
//※ To create DB schema in the development environment.
using var scope = app.Services.CreateScope();
using var dbctx = scope.ServiceProvider.GetRequiredService<AppDbContext>();
dbctx.Database.EnsureDeleted(); // 移除
dbctx.Database.EnsureCreated(); // 再重建 --- 關鍵指令
// TestData.CreateInitialDataForDemo(); // 在資料庫加入展示所需資料。
}
...§ 開發關鍵紀錄 - DataAnnotation
請直接閱讀程式碼。要注意的是 EF 的欄位定期有特定用法,比如名稱為:Id,會直接預設成 Primay Key,若 type := int 直接組態成 identity。還有一些其他泛用規則。
§ 完整程式碼
§ 主要參考文件
(EOF)
Last updated