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 三步驟

  1. 預先建立目標資料庫,並拿到連線字串。

  2. 安裝套件

  3. 初次分析與宣告初版 entities

  4. 執行 EnsureCreated() 建立 entities。

  5. 依開發狀況加入 DataAnnotation 階段性精進。

    1. 必要的話,加入DB專用能力。

  6. 回到步驟 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()

Program.cs
...

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