2014-09-02 94 views
4

我在一個類中定義的可空DateTime屬性:可爲空的DateTime屬性

public DateTime? ControlDate { get; set; } 

當使用EF 6 CodeFirst生成數據庫(SQL服務器2008)從我的模型,我得到:

ControlDate null

的問題是,當我救我的實例與ControlDate=null我得到這個異常:

conversion of a datetime2 data type to a datetime data type 
resulted in an out-of-range value 

我已閱讀多個相關帖子和文章說,這通常發生在你 定義一個非空的日期時間屬性,並嘗試將其保存不前設置一個有效的日期, 有的人建議設置該屬性爲可爲空如果屬性值可以爲null(這是我的特例)。

我的問題是:爲什麼EF試圖設置一個默認日期,當我的屬性和列類型可爲空。 Null應該是一個有效的值,並且應該一直流向數據庫,而不需要進行任何其他轉換。

這裏相關文章:Conversion of a datetime2 data type to a datetime data type results out-of-range value

編輯:Here is a very similar question。非常詳細的解釋,以防有人感興趣。

經驗教訓:只是想澄清一下,仔細觀察後,我發現這是我的一個問題。右鍵保存我的對象之前,它被設置爲:

myObject.ControlDate = new DateTime() 

其中,同時檢查,它顯示的默認不相容日期1/1/0001。衆所周知這會導致這種例外。所以,我的結論:

  • 模型聲明一個非空的DateTime屬性將導致SQL Server中的datetime數據類型。
  • 類聲明一個可空DateTime屬性的實例就可以到數據庫保存爲空
  • 手動設置有效的默認日期(如果<> NULL)這是非常重要的,否則會其設置爲1/1/0001,並拋出異常
+0

你是sur e它不是因爲另一個'DateTime'屬性? – tia 2014-09-02 12:37:26

+0

將列類型更改爲datetime2(7) – 2014-09-02 12:42:39

+0

請閱讀此文[DateTime2](http://stackoverflow.com/questions/3310569/what-is-the-significance-of-1-1-1753-in-sql -server) – 2014-09-02 12:46:35

回答

4

據我所知,它實際上是直接映射到.NET的DateTime類型的SQL服務器datetime2類型,所以您可能需要更改的類型你在SQL Server中的專欄

+0

是的,這似乎工作@ Joeb454。現在我正在考慮是否需要將所有'DateTime'屬性更改爲'datetime2' – 2014-09-02 13:28:13

+0

這取決於您是將它們直接映射到SQL Server,還是要處理每次保存中的映射。就個人而言,如果有選擇,我會更改SQL Server數據類型,但這取決於您的情況;做出這樣的改變可能是不切實際的,或者可能是不可行的(例如,在更多的企業環境中) – Joeb454 2014-09-02 13:32:32