2013-08-17 4 views
2

Мой запрос Linq столбца DateTimeOffset всегда вызывает InvalidTimeZoneException. Данные выглядят правильно. Любая идея, что происходит?Linq DateTimeOffset throws InvalidTimeZoneException

Детали:

Oracle Column: CREATED_DATETIME TIMESTAMP(0) WITH TIME ZONE 

    EF MAPPING: public Nullable<System.DateTimeOffset> CREATED_DATETIME { get; set; } 

    DataAccess: ODP.net Oracle.DataAccess 

    Data Sample: (Timezone column available but not used) 

     CREATED_DATETIME    TIMEZONE_NAME 
     8/16/2013 5:06:05 PM +00:00 US/Central 
     8/16/2013 5:35:06 PM +00:00 US/Mountain 

Код:

var q = from isr in pc.ISRs 
       select isr.CREATED_DATETIME; 
     try 
     { 
      DateTimeOffset? value = q.First(); 
     } 
     catch (InvalidTimeZoneException tze) 
     { 
      throw new ApplicationException(tze.Message); 
     } 
     catch (Exception e) 
     { 
      throw new ApplicationException(e.Message); 
     } 

     var orders = from o in q select o; 
+0

Нельзя ли указать карту Nullable вместо Nullable ? – BartoszKP

+0

DateTimeOffset - это сопоставление по умолчанию символа TIMESTAMP (0) с типом времени TIME ZONE. Я попытаюсь настроить отображение в datetime. – sgilmore

+0

Нет, извините, когда я смотрю на это сейчас, я не думаю, что это проблема. – BartoszKP

ответ

0

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 не будет работать. По крайней мере - пока нет.

Это позор действительно. Названия областей - хорошая функция, потому что тогда вы автоматически получаете выгоду от изменений летнего времени, которые включены в расчет.

Смежные вопросы