2012-03-02 19 views
7

Tôi sử dụng EF (mô hình EDMX - DB trước) để ánh xạ "TIMESTAMP WITH TIME ZONE" tới DateTimeOffset. khi tôi gán DateTimeOffset cho Oracle, phần Zone được lưu không chính xác."TIMESTAMP WITH TIME ZONE" <--> DateTImeOffset mapping sẽ không cung cấp phần Zone trên các lệnh INSERT (Entity Framework + Oracle)

Vì vậy, nếu sử dụng mô hình, ví dụ, để chèn giá trị 29/02/2012 10:10:10 +04:00, giá trị mà là thực sự được lưu trữ trong Oracle là 29/02/2012 10:10:10 +02:00 (giả sử 02: 00 là khu vực địa phương) Lưu ý rằng ánh xạ chỉ hoạt động tốt khi truy vấn dữ liệu. Chỉ INSERT (thông qua ObjectContext.SaveChanges()) bị hỏng ...

Tôi đã gỡ lỗi vào "Oracle.DataAccess.dll" (sử dụng ILSpy :)) và thấy rằng mã ánh xạ cho EF bỏ qua vùng đó ("Nhà cung cấp dữ liệu Oracle" chỉ gửi DateTimeOffset.DateTime).

Có ai biết giải pháp khác không?

Cảm ơn trước Eli

BTW: Tôi đang sử dụng .net4, EF4, Oracle 11g, ODAC 11,2 phát hành 4 (11.2.0.3.0)

Trả lời

0

Bạn có thể thử để dynamicly set the Session Time Zone, mà " có hiệu lực khi giá trị TIMESTAMP được chuyển đổi thành TIMESTAMP WITH KHU THỜI GIAN hoặc TIMESTAMP VỚI ĐỊA ĐIỂM ĐỊA ĐIỂM KHU VỰC ĐỊA PHƯƠNG ".

... tất nhiên là một bản hack khủng khiếp, cũng bởi vì bạn không thể thực thi phiên thay đổi trực tiếp thông qua SQL. Bạn sẽ phải sử dụng một cái gì đó như

begin DBMS_UTITLITY.EXEC_DDL_STATEMENT ('Alter Session Set TIME_ZONE = ''+04:00'''); end; 
0

Oracle thừa nhận đây là lỗi https://community.oracle.com/thread/2360615?tstart=0. Và họ buồn nó đã được cố định trong lỗi 13851978. Nhưng thử nghiệm của tôi trên máy khách oracle trên 11.2.0.3.0 vẫn thất bại.

Giải pháp là @HAL 9000 đề xuất đặt múi giờ của phiên với giờ và phút trong khoảng thời gian của DatetimeOffset trước khi lưu vào cơ sở dữ liệu. Nhưng điều này sẽ không hoạt động nếu có nhiều thuộc tính DatetimeOffset trong một đối tượng và các thuộc tính này có các khoảng thời gian khác nhau bên trong Datetimeoffset.

Một giải pháp thay thế khác là thay thế ODP.NET bằng nhà cung cấp dữ liệu bên thứ ba như Devart's DotConnect (Tôi đã thử nghiệm tính năng này, nó hoạt động đối với tôi). Có sự so sánh trong stackoverflow về các nhà cung cấp dữ liệu khác nhau https://stackoverflow.com/a/8298684/1443505.

0

Lưu trữ bù trong cơ sở dữ liệu có thể không giữ được tốt cho Quản lý bù trừ tiết kiệm ánh sáng ban ngày. Sẽ là một cách hay để luôn sử dụng tên múi giờ so với các giá trị bù trừ mà mục đích không bị ảnh hưởng.

--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' 
Các vấn đề liên quan