“具有时区的时间戳”< - > DateTImeOffset映射不会在INSERT命令(Entity Framework + Oracle)上提供Zone部分

时间:2012-03-02 10:03:13

标签: oracle entity-framework timestamp datetimeoffset zone

我使用EF(EDMX模型 - 数据库优先)将“TIMESTAMP WITH TIME ZONE”映射到DateTimeOffset。当我将DateTimeOffset提交给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)。

有没有人知道解决方法?

提前致谢 利

顺便说一句:我使用的是.net4,EF4,Oracle 11g,ODAC 11.2第4版(11.2.0.3.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;

答案 1 :(得分:0)

Oracle承认这是一个错误https://community.oracle.com/thread/2360615?tstart=0。而且他们很遗憾它已经修复了错误13851978.但我在11.2.0.3.0上对oracle客户端的测试仍然失败。

解决方案是@HAL 9000建议在保存到数据库之前使用DatetimeOffset的时间跨度设置会话的时区。但是,如果一个对象中有多个DatetimeOffset属性,并且这些属性在Datetimeoffset中具有不同的时间跨度,则无法工作。

另一个替代方案是将第二方数据提供商(如Devart的DotConnect)替换为ODP.NET(我已经对此进行了测试,它对我有用)。 stackoverflow中有关于不同数据提供者https://stackoverflow.com/a/8298684/1443505的比较。

答案 2 :(得分: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'