«TIMESTAMP WITH TIME ZONE» <-> Отображение DateTImeOffset не доставит часть зоны в командах INSERT (Entity Framework + Oracle) - PullRequest
7 голосов
/ 02 марта 2012

Я использую EF (модель EDMX - сначала БД), чтобы сопоставить «TIMESTAMP WITH TIME ZONE» с DateTimeOffset. когда я фиксирую DateTimeOffset в Oracle, часть Zone сохраняется неправильно.

Таким образом, если использовать модель, например, для вставки значения 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» передает только DateTimeOffset.DateTime).

Кто-нибудь знает обходной путь?

Заранее спасибо Eli

Кстати: я использую .net4, EF4, Oracle 11g, ODAC 11.2 Release 4 (11.2.0.3.0)

Ответы [ 3 ]

0 голосов
/ 26 апреля 2014

Oracle признал, что это была ошибка https://community.oracle.com/thread/2360615?tstart=0. И они сожалели, что это было исправлено в ошибке 13851978. Но мой тест на клиенте oracle на 11.2.0.3.0 все еще не прошел.

Решениекак @HAL 9000 предложил установить часовой пояс сеанса с часами и минутами в промежутке времени DatetimeOffset перед сохранением в базу данных.Но это не сработает, если в одном объекте несколько свойств DatetimeOffset, и эти свойства имеют разные временные интервалы внутри Datetimeoffset.

Другой альтернативой является замена ODP.NET сторонним поставщиком данных, таким как Devart's DotConnect (I ').проверил это, у меня работает).Существует сравнение в стеке потока для разных поставщиков данных https://stackoverflow.com/a/8298684/1443505.

0 голосов
/ 01 января 2015

Хранение смещений в базе данных может не подходить для управления смещениями в летнее время. Будет хорошей практикой всегда использовать имена часовых поясов над значениями смещения, если цель не затронута.

--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'
0 голосов
/ 12 марта 2012

Можно попытаться динамически установить часовой пояс сеанса , который "вступает в силу, когда значение TIMESTAMP преобразуется в тип данных TIMESTAMP WITH TIME ZONE или TIMESTAMP WITH LOCAL TIME ZONE".

... ужасный взлом, конечно, также потому, что вы не можете выполнить изменение сеанса напрямую через SQL.Вы должны использовать что-то вроде

begin DBMS_UTITLITY.EXEC_DDL_STATEMENT ('Alter Session Set TIME_ZONE = ''+04:00'''); end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...