前言
上次,我們發現《DateOnly 和 TimeOnly 類型居然不能序列化》。
但問題還不僅僅如此。
問題重現
假設有下列實體類:
public?class?User
{public?int?Id?{?get;?set;?}public?string?Name?{?get;?set;?}????????public?DateOnly?Birthday?{?get;?set;?}
}
由于Birthday
只需要日期,所以我們使用了DateOnly
類型。
但是,在使用 EF Core 6 存儲到數據庫時,出現如下錯誤:由于數據庫沒有 DateOnly 類型,我們使用的是?datetime 類型
結果DateOnly
不能被 Map 成datetime
數據庫類型。
重載 OnModelCreating
根據提示,我們重載了OnModelCreating
方法,發現有個HasColumnType
方法,用于配置屬性在面向關系數據庫時映射到的列的數據類型:
modelBuilder.Entity<User>().Property(t?=>?t.Birthday).HasColumnType("datetime");
但是,沒有任何效果。
HasConversion 方法
繼續查找,發現還有個HasConversion
方法,用于配置屬性,以便在寫入數據庫之前轉換屬性值并在從數據庫中進行讀取時轉換回:
modelBuilder.Entity<User>().Property(t?=>?t.Birthday).HasConversion(d?=>?d.ToDateTime(TimeOnly.MinValue),d?=>?DateOnly.FromDateTime(d));
現在,EF Core 6 已經可以正確地處理 DateOnly,并使用datetime
數據庫類型來存儲它。
結論
今天,我們介紹了使用轉換器來告訴 EF Core 6 如何處理 DateOnly。
添加微信號【MyIO666】,邀你加入技術交流群