7

EF (EDMX モデル - DB が最初) を使用して、「TIMESTAMP WITH TIME ZONE」を DateTimeOffset にマップします。DateTimeOffset を Oracle にコミットすると、Zone 部分が正しく保存されません。

たとえば、モデルを使用して value を挿入する場合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 Data Provider」はDateTimeOffset.DateTimeのみを渡します)。

誰かが回避策を知っていますか?

前もってありがとうエリ

ところで:私は.net4、EF4、Oracle 11g、ODAC 11.2リリース4(11.2.0.3.0)を使用しています

4

3 に答える 3

0

Session Time Zoneを動的に設定してみてください。これは、「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;
于 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

オラクルは、これがバグであると認めましたhttps://community.oracle.com/thread/2360615?tstart=0。そして、彼らはそれがバグ 13851978 で修正されたことを悲しんでいます。しかし、11.2.0.3.0 の Oracle クライアントでの私のテストはまだ失敗しています。

解決策は、@ HAL 9000が提案したように、データベースに保存する前に、セッションのタイムゾーンをDatetimeOffsetの時間と分で設定することです。ただし、1 つのオブジェクトに複数の DatetimeOffset プロパティがあり、これらのプロパティが Datetimeoffset 内で異なるタイムスパンを持つ場合、これは機能しません。

もう 1 つの方法は、ODP.NET を Devart の DotConnect などのサードパーティ データ プロバイダーに置き換えることです (私はこれをテストしましたが、うまくいきます)。さまざまなデータ プロバイダーに関する stackoverflow の比較がありますhttps://stackoverflow.com/a/8298684/1443505

于 2014-04-26T07:26:02.297 に答える