2012-03-02 71 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'