Oracle, TIMESTAMP WITH TIME ZONE
типа (он же TIMESTAMPTZ
) является Забавное существо. Он хранит дату, время и либо фиксированное «смещение часового пояса» , либо «имя региона часового пояса».
Если существует фиксированное смещение, то тип DateTimeOffset
в .Net будет хорошим совпадением, и неудивительно, что Entity Framework использует это как значение по умолчанию. (Хотя технически, отображение, вероятно, происходит от базового поставщика ODP.NET, а не от EF.)
Но когда это время названия зоны региона, там будут вопросы:
Того время имена зон являются часовыми поясами IANA и не могут использоваться непосредственно с классом TimeZoneInfo
. Их нужно будет перевести. См. Раздел о базах данных часовых поясов в разделе timezone tag wiki.
.NET не имеет тип, который представляет собой DateTime
или DateTimeOffset
в паре с временной зоны в.
Данные Oracle фактически не включают имя часового пояса. Вместо этого он включает указатель обратно на идентификатор в системных данных в базе данных Oracle. Поэтому любое разрешение этого имени из необработанных битов должно быть выполнено, пока соединение с базой данных все еще открыто. Не так давно я ответил на вопрос об этом и как он относится к Java. Вы можете прочитать my response here, который в основном применяется для .NET. (Хотя я уверен, что реализация довольно сильно отличается в ODP.NET.)
Стоит отметить, что Noda Time библиотека включает в себя как данные IANA часовых поясов, и ZonedDateTime
типа, которые могли бы в полной мере представляют собой Oracle TIMESTAMPTZ
. Прямого сопоставления нет, но я полагаю, что при вызове вашей базы данных Oracle должно быть возможно построить ZonedDateTime
.
Однако в настоящее время не поддерживает Noda Time с платформой Entity Framework, так что это будет мешать здесь. (Это в моей повестке дня, но я еще не изучил ее очень глубоко.)
Так что, скорее всего, единственный способ использования типа TIMESTAMPTZ
в рамках Entity Framework - убедиться, что вы используете фиксированный только офсетные зоны. Использование его с именем региона часового пояса Oracle не будет работать. По крайней мере - пока нет.
Это позор действительно. Названия областей - хорошая функция, потому что тогда вы автоматически получаете выгоду от изменений летнего времени, которые включены в расчет.
Нельзя ли указать карту Nullable вместо Nullable ? –
BartoszKP
DateTimeOffset - это сопоставление по умолчанию символа TIMESTAMP (0) с типом времени TIME ZONE. Я попытаюсь настроить отображение в datetime. – sgilmore
Нет, извините, когда я смотрю на это сейчас, я не думаю, что это проблема. – BartoszKP