7

我使用 EF(EDMX 模型 - 首先是 DB)将“TIMESTAMP WITH TIME ZONE”映射到 DateTimeOffset。当我将 DateTimeOffset 提交给 Oracle 时,Zone 部分保存不正确。

因此,如果使用模型,例如,插入 value 29/02/2012 10:10:10 +04:00,则实际存储在 Oracle 中的 value 是29/02/2012 10:10:10 +02:00(假设 +02:00 是本地区域)请注意,在查询数据时映射工作得很好。只有 INSERT(通过 ObjectContext.SaveChanges())被破坏了......

我已经调试到“Oracle.DataAccess.dll”(使用 ILSpy :))并发现 EF 的映射代码省略了该区域(“Oracle 数据提供程序”仅通过 DateTimeOffset.DateTime)。

有谁知道解决方法?

提前感谢伊莱

顺便说一句:我正在使用 .net4、EF4、Oracle 11g、ODAC 11.2 Release 4 (11.2.0.3.0)

4

3 回答 3

0

您可以尝试动态设置 Session Time Zone,它“在将 TIMESTAMP 值转换为 TIMESTAMP WITH TIME ZONE 或 TIMESTAMP WITH LOCAL TIME ZONE 数据类型时生效”。

...当然是一个可怕的 hack,还因为您不能直接通过 SQL 执行 alter session。你必须使用类似的东西

begin DBMS_UTITLITY.EXEC_DDL_STATEMENT ('Alter Session Set TIME_ZONE = ''+04:00'''); end;
于 2012-03-12T07:18:36.127 回答
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'
于 2015-01-01T09:51:21.500 回答
0

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

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

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

于 2014-04-26T07:26:02.297 回答