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: ... ".
Ich überlege mir jetzt verschiedene Ansätze, um dieses Problem zu lösen, einschließlich:
Ändern Sie den Typ in etwas, das DateTime in der Datenbank zugeordnet werden kann (schlechteste Lösung)
Belassen Sie den Spaltentyp als DateTimeOffset in der Datenbank. Ordnen Sie die Spalte zwei Attributen im Entity Framework-Modell, einem 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?
Fügen Sie dem EF-Datenvertrag, der die CreationTime-Eigenschaft enthält, einfach den DateTimeOffset-Typ als KnownType hinzu, wie in Ссылка .
DateTimeOffset ist einer der komplexen .NET-Typen, der tatsächlich als primitiv behandelt wird, außer dass er nicht als KnownType für die Serializer standardmäßig registriert ist. Sie müssen das also manuell tun.
Ihr Code könnte so aussehen:
%Vor%Es ist ein bisschen wie ein Hack mit Reflektion, aber ich setze folgendes in die Anwendung ein: Ich habe WebActivator verwendet bei CROT im Oktober 2011 hat weit gearbeitet.
%Vor%Ich schlage vor, ein Feld von Ihrem Dienst zu übergeben, das TimeZone.GetUtcOffset Method return und berechnet dann die Differenz zwischen diesem und dem Offset des Clients und addiert / subtrahiert diese Differenz dann von der zurückgegebenen DateTime.
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 Springen.
Das habe ich gemacht und habe keine Probleme.
Tags und Links wcf entity-framework service