實體框架7無法插入日期時間

debian entity-framework-core mono sql-server windows

我正在使用EntityFramework 7,beta7並具有以下實體:

C#

public class Log
{
    [Column(TypeName ="datetime")]
    public DateTime Date { get; set; }
    ...
}

SQL

public class Log
{
    [Column(TypeName ="datetime")]
    public DateTime Date { get; set; }
    ...
}

我執行以下操作:

public class Log
{
    [Column(TypeName ="datetime")]
    public DateTime Date { get; set; }
    ...
}

這在Windows上是成功的,但在debian上的mono下失敗了。相同的SQL服務器/數據庫。生成的SQL如下。請注意為@p1呈現的類型和值的差異:

視窗

public class Log
{
    [Column(TypeName ="datetime")]
    public DateTime Date { get; set; }
    ...
}

Linux的

public class Log
{
    [Column(TypeName ="datetime")]
    public DateTime Date { get; set; }
    ...
}

Linux上的失敗是:

從字符串轉換日期和/或時間時轉換失敗。

問題

  1. 為什麼Windows產生datetime2時類型是明確設定datetime
  2. linux版本生成無效的SQL,因此失敗。如何在mono / linux上插入datetime值?

一般承認的答案

  1. .NET DateTime類型比sql server的“datetime”類型具有更寬的範圍。實際上,.NET DateTime與sql server的“datetime2”類型具有相同的範圍,這就是為什麼Entity Framework在將DateTime轉換為sql日期時會在任何地方使用datetime2(如果可能)(如示例所示)。在這種情況下,表列的類型無關緊要。您可以閱讀此設計會議說明 ,其中EF團隊討論了datetime和datetime2的問題,並決定將其保留原樣(以及其背後的原因)。

  2. Mono使用TDS與sql服務器一起工作(基於FreeTDS ,它使用了相當過時的版本。這個版本不知道sql server的“datetime2”類型,所以不要升級到新版本的TDS(也許這太過分了)現在工作),實現了一種黑客攻擊,將datetime2從\轉換為字符串。現在,datetime2的精度高於datetime,所以將datetime2轉換為string然後將該字符串轉換為datetime(這是隱式完成的)會導致錯誤你看。這很容易檢查:

    select cast('2015-09-28T23:03:21.5561720' as datetime2) -- < all fine
    select cast('2015-09-28T23:03:21.5561720' as datetime) -- < error from your question
    

    你可以在這裡閱讀更多相關信息。

您可能會問,是否可以在單聲道上使用EF與sql server。那麼,您可以通過在EF模型中將ProviderManifestToken設置為2005來解決此問題。這將使EF與sql server 2005一起使用,並且它不會在任何地方使用datetime2。但是你會丟失在sql server 2005之後添加的其他類型,更不用說那是臟黑客。

作為旁注 - 最好不要對帶有sql server的mono進行任何認真的開發。單聲道的SQL服務器提供程序充滿了bug,上面的bug是最無辜的。它有空值的問題,連接池的問題(這個問題非常嚴重 - 如果你在連接池連接上超時 - 這個連接將在整個生命週期中被破壞,並且該連接上的所有查詢都將失敗.Hack - 從連接中刪除連接池,如果你的查詢超時了)等等。大多數這些錯誤已知多年,並沒有固定。如果你有選擇 - 只需使用postgresql,它是免費的,好的,我在單聲道上沒有問題。




許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因