2013-03-06 107 views
18

是否有可能在使用Code-First模型時全局設置實體框架DbContext以使用datetime2所有屬於System.DateTime的屬性?強制實體框架5使用datetime2數據類型

我可以通過使用HasColumnType()方法爲每列執行此操作,但對於現有的代碼庫,我想要一個全局解決方案。

+0

只是好奇你爲什麼要這樣做。我問的原因是,當嘗試提交具有不可爲空的DateTime列(DateTime.MinVal)的默認值的實體時,這是一個非常常見的錯誤。異常表明您應該使用DateTime2列,但除非您確實需要額外的精度,否則這種情況通常會引起誤解。解決方法是爲DateTime字段分配一個非默認值,或者將其定義爲可爲空。希望這可以幫助。 – 2013-03-06 16:35:06

+0

@ w.brian 1)我們有一張儲存藝術作品和作者的表格,這些表格可以在1753年以前製作/出生...... 2)如果這是可能的話,那麼它可以作爲對所有其他人進行最短日期驗證的替代方案領域。 3)技術好奇心... – 2013-03-06 16:40:33

+0

難題。只是想確保你沒有像我在上面提到的例外時那樣,像我最初所做的那樣咆哮錯誤的樹。 – 2013-03-06 16:44:39

回答

25

由於EF6已經出現了很長一段時間,並且這個問題仍然顯示在搜索中,下面是使用自定義約定來設置SQL類型的方式。在您的DbContext類的OnModelCreating方法內:

modelBuilder.Properties<DateTime>() 
    .Configure(c => c.HasColumnType("datetime2")); 
+0

僅用於新模式嗎?因爲我在Update-Database上收到此錯誤消息:ALTER TABLE ALTER COLUMN日期失敗,因爲一個或多個對象訪問此列。 – Jacob 2017-07-07 03:41:38

+1

@Jacob你的意思是說,如果你已經爲模型創建了數據庫,它會工作嗎?是的,但是您必須記住在將約定添加到OnModelCreating之後創建遷移。這是我做到的,所以我知道它的工作原理如果做得對:) – 2017-07-09 10:15:10

+1

由於表約束,我有錯誤。我解決它通過根據這個答案手動刪除它們:https://stackoverflow.com/a/19461205/665783但是,你的答案非常幫助我們。我們通過您發佈的代碼遷移了我們的整個數據庫。謝謝! – Jacob 2017-07-09 13:49:51

7

不在EF5中,但EF6(目前在alpha版本中)允許與custom conventions一起使用。對於EF5,您需要一些基於反射的基於自定義約定的框架,這將通過反射向模型構建器添加HasColumnType調用 - 例如檢查EF Code First Extras(它聲稱支持可插入約定)。