[英]Handling MySQL Zero Date with EF Core
背景:我有200多個傳統的VB6應用程序,我將轉換為C#,使用EntityFramework Core作為我們的ORM。 不幸的是,許多應用程序使用MySQL的零日期(0000-00-00)
。 所以我需要迎合這一點,並能夠以某種方式存儲零日期。 在200多個應用程序中更改此功能的基本方式目前不是一種選擇。
設置:我可以定義一個實體屬性,表示MySQL中的字段定義,例如:
public DateTime ExpiryDate { get; set; }
...
entity.Property(e => e.ExpiryDate)
.IsRequired()
.HasColumnType("datetime")
.HasDefaultValueSql("'0000-00-00 00:00:00'");
如果在插入上沒有發送任何值,這將正確存儲零日期。
問題:因為C#的最小日期為0001-01-01
所以我無法明確存儲零日期。 所以我的問題是......有沒有辦法設置我的實體來進入和退出數據庫?
到目前為止:我嘗試使用支持字段,定義為字符串,以便我可以操縱任何DateTime.MinValue
成為'0000-00-00'
。 這允許我存儲零日期,但在嘗試檢索數據時會導致轉換問題(正如您所料):
System.InvalidCastException:無法將類型為“System.DateTime”的對象強制轉換為“System.String”。
我目前使用的包是:
人們可能會爭辯說這更適合作為評論,但基本上,這是為了解決這個問題。
和:
你必須幫我一點,因為我手頭沒有工作系統,所以我從頭到尾這樣做。 (而且我有點匆忙)
首先,從未映射的屬性開始:
[NotMapped]
public DateTime ExpiryDate { get; set; }
此屬性未映射。 它可能導致有關數據庫的一些錯誤與模型不匹配,但我們可以克服這一點。 查詢數據時,不會自動填充此屬性。 所以,我們需要一種方法來處理這個問題。
例如,( 這是一個不好的例子,因為我們需要實體中的某個上下文 ):
[NotMapped]
public DateTime? ExpiryDate
{
get
{
//of course you'll need some caching here
var s = context.Database.SqlQuery<string>("query to select datetime as string");
//additional logic to determine validity:
if (s == "0000-00-00")
return null;
//else:
//do the conversion
}
}
這里的基本問題; 你想在EF框架內支持多遠? 您是否只需要使用EF等的更改跟蹤器來閱讀或寫入?
還有其他可能性,例如,在SQL本身內執行CAST到nvarchar以獲取數據並進一步處理它。
也許ModelBuilder
公開了一些額外的選項。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.