2010-09-13 17 views
9

Intento crear un Servicio de datos WCF para un modelo de Entity Framework, que contiene algunos atributos de tipo DateTimeOffeset. Sin embargo, el WCF Data Service no admite el tipo DateTimeOffset como me enteré después de buscar en Google el texto de excepción "La propiedad 'CreationTime' en el tipo 'Tarea' es del tipo 'DateTimeOffset' que no es un tipo de primitiva compatible. '. Consulte los registros del servidor para obtener más detalles, el seguimiento de pila de excepción es: ... ".Mejor solución para arreglar DateTimeOffset sobre WCF Data Service problema

Ahora estoy considerando diferentes enfoques para resolver este problema, incluyendo:

  1. el cambio del tipo de algo que puede ser asignada a DateTime en la base de datos (la peor solución)

  2. Deja la columna escriba la base de datos como DateTimeOffset, asigne la columna a dos atributos en el modelo de Entity Framework, un DateTime y un atributo adicional "Offset" de tipo entero.

Realmente no me gusta ninguno de estos enfoques. ¿Alguien ha encontrado un buen trabajo para solucionar este problema?

+0

¿Has buscado proporcionar tu propio serializador/deserializador? – louisgab

Respuesta

2

Simplemente agregue el tipo DateTimeOffset como KnownType al contrato de datos EF que contiene la propiedad CreationTime, como se explica en http://msdn.microsoft.com/en-us/library/ms730167.aspx.

DateTimeOffset es uno de los tipos complejos de .NET que en realidad se maneja como una primitiva, excepto que no está registrado por defecto como un Tipo Conocido para los serializadores. Entonces debes hacer esto manualmente.

Su código podría tener este aspecto:

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

Sugiero pasar un campo de su servicio que contiene TimeZone.GetUtcOffset Method return y luego calcular la diferencia entre eso y el desplazamiento del cliente y luego sumar/restar esa diferencia del DateTime devuelto.

1

Es un poco de un truco utilizando la reflexión, pero poniendo lo siguiente en la solicitud de puesta en marcha (utilicé WebActivator) ha funcionado hasta ahora para mí el uso de octubre de 2011 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

El problema que está viendo es que el XmlSerializer no puede serializar DataTimeOffset. Sin embargo, si usa DataContractSerializer, manejará DateTimeOffset muy bien. No hay necesidad de serializadores personalizados o aros adicionales para saltar.

Eso es lo que hice y no tengo problemas.

+0

Creo que es apropiado agregar un elogio cuando votas por debajo. No estoy seguro de ver el problema aquí, ya que esta solución ha estado en producción en más de 5000 implementaciones durante casi dos años para nosotros y continúa sin problemas. – SonOfPirate