2012-03-02 72 views
7

我使用EF(EDMX模型 - 數據庫優先)將「TIMESTAMP WITH TIME ZONE」映射到DateTimeOffset。當我將DateTimeOffset提交給Oracle時,Zone部分保存不正確。「TIMESTAMP WITH TIME ZONE」<--> DateTImeOffset映射不會在INSERT命令(實體框架+ Oracle)上傳遞區域部分

所以,如果利用該模型,例如,插入值29/02/2012 10:10:10 +04:00,實際存儲在Oracle中值爲29/02/2012 10:10:10 +02:00(假設+02:00是本地區域) 注意,映射查詢時,工作得很好數據。只有INSERT(通過ObjectContext.SaveChanges())被打破...

我調試到「Oracle.DataAccess.dll」(使用ILSpy :)),並發現EF的映射代碼省略了區域「Oracle Data Provider」僅傳遞DateTimeOffset.DateTime)。

有誰知道解決方法?

在此先感謝 禮

BTW:我使用.NET4,EF4,是Oracle 11g,ODAC 11.2第4版(11.2.0.3.0)

回答

0

你可以嘗試動態地set the Session Time Zone,其中「將TIMESTAMP值轉換爲TIMESTAMP WITH TIME ZONE或TIMESTAMP WITH LOCAL TIME ZONE數據類型「時生效」。

......當然還有一個可怕的黑客攻擊,也是因爲你不能直接通過SQL執行alter session。你必須使用類似

begin DBMS_UTITLITY.EXEC_DDL_STATEMENT ('Alter Session Set TIME_ZONE = ''+04:00'''); end; 
0

甲骨文承認這是一個錯誤https://community.oracle.com/thread/2360615?tstart=0。他們傷心已經修復了bug 13851978.但是我在11.2.0.3.0上的oracle客戶端上的測試仍然失敗。

解決方案是@HAL 9000建議在保存到數據庫之前,使用DatetimeOffset的時間跨度中的小時和分鐘設置會話的時區。但是,如果一個對象中有多個DatetimeOffset屬性,並且這些屬性在Datetimeoffset內有不同的時間片,則這不起作用。

另一種替代方法是用第三方數據提供程序(如Devart的DotConnect)替換ODP.NET(我測試過它,它適用於我)。有關於不同數據提供商https://stackoverflow.com/a/8298684/1443505的計算器比較。

0

在數據庫中存儲偏移量可能不適用於夏令時偏移管理。 在不影響目的的情況下,始終使用超過偏移量值的時區名稱將是一種很好的做法。

--To store actual time and timezone value 
to_timestamp_tz('10-SEP-2014 01:40:00.000000000 US/Pacific','DD-MON-YYYY HH24:MI:SS.FF9 TZR') 

--To store actual time at timezone converted to UTC timezone value for uniformity 
to_timestamp_tz('10-SEP-2014 01:40:00.000000000 US/Pacific','DD-MON-YYYY HH24:MI:SS.FF9 TZR') at time zone 'UTC'