2010-09-13 2 views
9

Ich versuche, einen WCF-Datenservice für ein Entity Framework-Modell zu erstellen, das einige Attribute vom Typ DateTimeOffset enthält. Der WCF-Datenservice unterstützt jedoch nicht den Typ DateTimeOffset, wie ich nach dem Googlen des Ausnahmetextes festgestellt habe. "Die Eigenschaft 'CreationTime' vom Typ 'Task' ist vom Typ 'DateTimeOffset', was kein unterstützter primitiver Typ ist." Siehe Serverprotokolle Für weitere Details: Die Ausnahmestapel-Ablaufverfolgung ist: ... ".Am besten umgehen, um DateTimeOffset über WCF Data Service zu beheben Problem

Ich erwäge nun verschiedene Ansätze einschließlich dieses Problem zu lösen:

  1. die Art zu etwas ändern, der Datetime in der Datenbank zugeordnet werden kann (schlechteste Lösung)

  2. die Säule verlassen geben Sie die Datenbank als DateTimeOffset ein, ordnen Sie die Spalte zwei Attributen im Entity Framework-Modell, einer DateTime und einem zusätzlichen Attribut "Offset" vom Typ Integer zu.

Ich mag wirklich keinen dieser Ansätze. Hat jemand eine gute Arbeit gefunden, um dieses Problem zu beheben?

+0

Haben Sie nach einem eigenen Serializer/Deserializer gesucht? – louisgab

Antwort

2

Fügen Sie dem EF-Datenkontrakt, der die CreationTime-Eigenschaft enthält, einfach den DateTimeOffset-Typ als KnownType hinzu, wie in http://msdn.microsoft.com/en-us/library/ms730167.aspx10 erläutert.

DateTimeOffset ist einer der komplexen .NET-Typen, der tatsächlich als primitiv gehandhabt wird, außer dass er nicht standardmäßig als KnownType für die Serializer registriert ist. Sie müssen das also manuell tun.

Ihr Code könnte wie folgt aussehen:

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

Ich empfehle Ihnen, ein Feld von Ihrem Dienst zu übergeben, das TimeZone.GetUtcOffset Method return enthält, und dann den Unterschied zwischen diesem und dem Offset des Clients zu berechnen und dann diese Differenz von der zurückgegebenen DateTime zu addieren/subtrahieren.

1

Es ist ein bisschen wie ein Hack Reflexion verwenden, aber setzen beginnt die folgend in der Anwendung (ich verwenden WebActivator) hat bisher funktioniert für mich 2011 mit Oktober CTP.

-1

Das Problem, das Sie sehen, liegt daran, dass der XmlSerializer DataTimeOffset nicht serialisieren kann. Wenn Sie jedoch den DataContractSerializer verwenden, wird DateTimeOffset problemlos verarbeitet. Keine Notwendigkeit für benutzerdefinierte Serialisierer oder zusätzliche Reifen zum Durchspringen.

Das ist, was ich getan habe und habe keine Probleme.

+0

Ich denke, es ist angebracht, einen Kommentar hinzuzufügen, wenn Sie abstimmen. Ich bin mir nicht sicher, ob ich das Problem hier sehe, da diese Lösung seit fast zwei Jahren in über 5.000 Bereitstellungen produziert wird und weiterhin problemlos ist. – SonOfPirate

Verwandte Themen