簡體   English   中英

使用EF Core處理MySQL零日期

[英]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”。

我目前使用的包是:

  • EFCore 1.1
  • PomeloEntityFrameWorkCore 1.1.2
  • MySQL 5.7.18

人們可能會爭辯說這更適合作為評論,但基本上,這是為了解決這個問題。

和:

你必須幫我一點,因為我手頭沒有工作系統,所以我從頭到尾這樣做。 (而且我有點匆忙)

首先,從未映射的屬性開始:

[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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM