2023年11月2日 星期四

EF Core Models With Fluent API

在EF Core 中,其中一環核心的設計應該就是Model ,而 EF Core 提供了數種設定 Model 方式,

一種就是常見的 「Data Annotations」,用於屬性掛載特性(property add Attribute)型式,而另一種方式

就是 EF Core 提供的 「Fluent API」,相較於Data Annotations 的方式其支援程度更廣...



其實選用「Fluent API」的方式設計,有一個考量,若當環境受限於需要使用 DBFirst ,那其中產

生出來的Model 皆會以 Fluent API 的設計風格呈現, 故大多會以「Fluent API」設計為第一優先。


另一個選用 Fluent API 的原因,就是複合PK 只能使用Fluent API,如

modelBuilder.Entity<Post>().HasKey(c => new { c.BlogId, c.Id });


準備來看一下「Data Annotations」 與「Fluent API」設計方向與差異,這邊都會以CodeFirst 為出發


首先以「Data Annotations」來設計 Person



再來設計 DbContext


專案目錄結構對應檔案


接下來使用 dotnet cli 來執行指令

dotnet ef migrations add init


執行後就會產生相關檔案


以上若在 ef migrations 執行後,若model 類別有相關異動,建議先 rebuild 專案後再次 megrations,

不然後續 ef database 可能會吃到舊的設計


再使用指令來實際產生資料庫資料表

dotnet ef database update




檢視資料表 Persons



檢視資料表欄位設計,必填欄位以及 PK 設定確實有到位,但「預設值」與「描述」卻沒有設定,以 Address 

欄位為例子


對應 Person 程式設計,其實註解與預設值皆有設定


接著使用 Fluent API 來設計 Model,先將 Person 原本的 Data Annotations 拉掉


再透過Fluent API 設計,需在 DbContext 類別中的 OnModelCreating() 方法內撰寫


由上圖可以看出,可以指定實際對應的資料表名稱,這邊是刻意設定 t_Persons,並且設定描述;

指定 Id 欄位為 PK,設定必填 IsRequired(),指定相關欄位初始值則使用 HasDefaultValueSql() 來表示


後續使用 dotnet cli 語法來建立資料庫資料表,其中欄位初始值與描述確實有如實呈現,

而原本Model 設計的 CreateAt Property 為 DateTime 型態,對應到資料庫會被設定成 datetime2(7),

並且資料表的描述也有被設定






【參考】

沒有留言:

張貼留言