2010-09-13 6 views
9

DateTimeOffeset türünde bazı öznitelikleri içeren bir Entity Framework modeli için bir WCF Veri Hizmeti oluşturmaya çalışıyorum. Ancak, WCF Veri Hizmeti, istisna metnini düzenledikten sonra bulduğum gibi DateTimeOffset türünü desteklemiyor "Görev 'türünde' CreationTime 'özelliği, desteklenen bir ilkel tür olan' DateTimeOffset 'türündedir. Daha fazla bilgi için istisna yığını izlemesi: ... ".WCF Veri Hizmeti sorunu üzerinden DateTimeOffset'i düzeltmek için en iyi yöntem

Şimdi de dahil olmak üzere, bu sorunu çözmek için farklı yaklaşımlar düşünüyorum

:

  1. değişim veritabanında DateTime eşlenebilir şeye tipi (en kötü çözelti)

  2. sütunu bırakın veritabanını DateTimeOffset olarak yazın, sütunu Entity Framework modelindeki iki özniteliğe, bir DateTime ve tip tamsayı için ek bir "Offset" özniteliğine eşleyin.

Bu yaklaşımlardan hiç hoşlanmadım. Bu sorunu düzeltmek için iyi bir iş bulmuş olan var mı?

+0

Kendi serializer/deserializer'ınızı sağlamayı düşündünüz mü? – louisgab

cevap

2

DateTimeOffset türünü, KnownType türü olarak, http://msdn.microsoft.com/en-us/library/ms730167.aspx'da açıklandığı gibi, CreationTime özelliğini içeren EF veri sözleşmesine ekleyin.

DateTimeOffset, aslında bir ilkel olarak ele alınan karmaşık .NET türlerinden biridir; bunun dışında, varsayılan olarak serializer'lara bir KnownType olarak kaydedilmemesi dışında. Yani bunu elle yapmanız gerekiyor.

Kodunuz aşağıdaki gibi görünebilir:

[DataContract] 
[KnownType(typeof(DateTimeOffset))] 
public class Task 
{ 
    [DataMember] 
    private DateTimeOffset CreationTime; 
... 
-1

Hizmetinizden TimeZone.GetUtcOffset Method return içeren bir alanın geçirilmesini ve ardından bu ve müşteri ofseti arasındaki farkı hesaplamayı ve ardından bu farkı döndürülen DateTime'dan ekleyerek/çıkarmanızı öneririm.

1

Bu yansıma kullanarak, ama uygulamasında aşağıdaki koyarak kesmek bir parçasıdır (I WebActivator kullanılan) şu ana kadar bana Ekim 2011 kullanmak için çalıştı başlangıç CTP.

var primitiveResourceTypeMapType = typeof(ResourceType).Assembly.GetType("System.Data.Services.Providers.PrimitiveResourceTypeMap"); 
Debug.Assert(primitiveResourceTypeMapType != null); 
var builtInTypesMappingField = primitiveResourceTypeMapType.GetField("builtInTypesMapping", BindingFlags.NonPublic | BindingFlags.Static); 
Debug.Assert(builtInTypesMappingField != null); 

var existingMap = ((KeyValuePair<Type, string>[])builtInTypesMappingField.GetValue(null)).ToList(); 
existingMap.Add(new KeyValuePair<Type, string>(typeof(DateTimeOffset), "Edm.DateTimeOffset")); 
existingMap.Add(new KeyValuePair<Type, string>(typeof(DateTimeOffset?), "Edm.DateTimeOffset")); 
builtInTypesMappingField.SetValue(null, existingMap.ToArray()); 
-1

Gördüğünüz sorun, XmlSerializer'ın DataTimeOffset'i seri hale getirememesidir. Ancak, DataContractSerializer'ı kullanırsanız, DateTimeOffset'i iyi kullanır. Özel seri hale getiriciler veya ekstra çemberler atlamak için gerek yok.

Yaptığım şey bu değil.

+0

Sanırım oy verdiğinizde bir övgü eklemek uygun. Bu çözüm, yaklaşık iki yıldır bizim için 5000'den fazla dağıtımda üretildiğinden ve sorun yaşamaya devam ettiğinden, sorunu burada görmediğimden emin değilim. – SonOfPirate

İlgili konular