2013-08-17 99 views
2

我的Linq對DateTimeOffset列的查詢總是拋出InvalidTimeZoneException。數據似乎是正確的。任何想法發生了什麼?Linq DateTimeOffset引發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

不應該映射可爲空而不是可爲空? – BartoszKP

+0

DateTimeOffset是Oracle TIMESTAMP(0)WITH TIME ZONE數據類型的默認映射。我將嘗試自定義映射到datetime。 – sgilmore

+0

不,對不起,我現在看它時,我不認爲這是問題。 – BartoszKP

回答

0

Oracle的TIMESTAMP WITH TIME ZONE類型,(又名TIMESTAMPTZ)是一個有趣的生物。它存儲日期,時間和或者固定的「時區偏移」「時區區域名稱」。

當存在固定偏移量時,那麼.Net中的DateTimeOffset類型將是一個很好的匹配項,實體框架將其用作默認值並不奇怪。 (雖然技術上,映射可能來自底層ODP.net提供商,而不是從EF)

但是當它是一個時區區域名稱,有將是問題:

  • 那些時間區域名稱是IANA時區,不能直接與TimeZoneInfo類一起使用。他們需要翻譯。請參閱timezone tag wiki中有關時區數據庫的部分。

  • .NET不具有表示DateTimeDateTimeOffset時區配對的任何類型。

  • Oracle數據實際上並不包含時區名稱。相反,它包含一個指向Oracle數據庫內系統數據中的id的指針。因此,在與數據庫的連接仍處於打開狀態時,必須完成對原始位的此名稱解析。不久前,我回答了一個關於這個問題的問題,以及它與Java的關係。你可以閱讀my response here,它主要仍然適用於.NET。 (雖然我敢肯定,實現在ODP.net完全不同。)

值得指出的是,Noda Time庫包括IANA時區數據,以及ZonedDateTime類型,它可以完全代表一個Oracle TIMESTAMPTZ。沒有直接的映射,但我想應該可以在調用Oracle數據庫時構造一個ZonedDateTime

但是,目前有不支持野田時間與實體框架,所以這會妨礙在這裏。 (這是在我的議程上,但我還沒有深入研究它。)

因此,最有可能的唯一方法就是能夠在Entity Framework中使用TIMESTAMPTZ類型,以確保您使用的是固定僅偏移區域。將它與Oracle「時區地區名稱」一起使用是行不通的。至少 - 還沒有。

真是太遺憾了。區域名稱是一個很好的功能,因爲這樣您就可以自動獲得夏時制時間更改併入計算中的好處。