最近在ASP.NET MVC中遇到一個問題,如題,在使用EF資料模型的時候,要去添加一條新的資料到Sqlserver資料庫,在之前項目中并沒有出現該異常,是以去扒了扒demo,發現有幾個字段(資料庫類型為datetime)savechange的時候預設綁定了datetime.now。問題就在這裡,我的新項目并沒有給定這幾個字段的資料。下面總結下:
SQL Server資料庫版本中的字段類型為datetime2
資料庫中,某個要進行Add或者Edit的字段的資料類型為datetime,比如表A中的today字段,類型為datetime。而背景代碼進行資料庫操作時,并沒有給today(datetime類型)指派。結果就是VS2015編譯的時候預設将其類型編譯為datetime2,導緻用EF進行add和edit操作的時候出現該異常。
給這些字段一個值(不管它是否在資料庫設定了預設值),并且日期要大于1753年1月1日,這是最簡單的方法。
将資料庫類型修改為datetime?類型,也就是說允許為空。
修改資料庫字段類型為datetime2類型,前提是資料庫要支援該類型。
在C#中用new DateTime(year,month,day,hour,minute,second)來限制精度,原因之後會在datetime2和datetime的差別中提到。
這個方法不太推薦,将model的edmx中的providerManifestToken設定成2005,這樣ef就預設轉化成datetime。
官方MSDN對于datetime2的說明:定義結合了 24 小時制時間的日期。 可将 datetime2 視作現有 datetime 類型的擴充,其資料範圍更大,預設的小數精度更高,并具有可選的使用者定義的精度。
這裡值的注意的是datetime2的日期範圍是"0001-01-01 到 9999-12-31"(公元元年 1 月 1 日到公元 9999 年 12 月 31 日)。
而datetime的日期範圍是:”1753 年 1 月 1 日到 9999 年 12 月 31 日“。這裡的日期範圍就是造成“從 datetime2 資料類型到 datetime 資料類型的轉換産生一個超出範圍的值”這個錯誤的原因。
轉自:http://blog.sina.com.cn/s/blog_bc5f90cd0102wufh.html