EntityFramework SQL 2005 not support datatype ‘datetime2’

因為在測試環境都是用 SQL 2008 的版本在做測試開發,到了正式環境要發佈的時候卻發生 not support datatype ‘datetime2’ 的錯誤。

Server Error in '/' Application.
--------------------------------------------------------------------------------

The version of SQL Server in use does not support datatype 'datetime2'.
Description: An unhandled exception occurred during the execution of the current web request.
Please review the stack trace for more information about
the error and where it originated in the code.

Exception Details: System.ArgumentException:
The version of SQL Server in use does not support datatype 'datetime2'.

  • 開發測試環境是 SQL 2008
  • 正式環境 SQL 2005
  • EntityFramework 4.3
  • Database First

問題發生原因

這邊有 datetime 跟 datetime2 的比較
在 SQL 2008 之後版本,微軟將資料庫的 datetime 欄位改為 datetime2,而當使用 EntityFramework Database First 的時候,就會根據資料庫的版本去產生 edmx。再利用 edmx 對應去產生物件做操作。所以如果使用的是 SQL 2008 產生出來的物件,在 Datetime 要存進資料庫的時候就會幫你轉成 SQL Datetime2 格式。當然這樣在 SQL 2008 下是沒有問題的,可是如果要拿同一份程式到 SQL 2005 執行就會造成這個錯誤。

解決方法

其實解決方法很簡單,只要將 edmx 用 XML Editor 開啟之後。找到資料庫對應版本的設定。

<!-- SSDL content -->
<edmx:StorageModels>
<Schema Namespace="Test.Store"
Alias="Self"
Provider="System.Data.SqlClient"
ProviderManifestToken="2008"
xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator"
xmlns="http://schemas.microsoft.com/ado/2009/02/edm/ssdl">
<EntityContainer Name="LiteonAward2012ModelStoreContainer">

將上面的第 6 行 2008 改為 2005 之後將檔案存檔,並且重新產生 POCO 或是 DBContext 物件編譯過後就可以了。


Using SQL Server 2008 and SQL Server 2005 and date time

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *