WCF数据服务和非基本类型

时间:2011-10-19 12:10:11

标签: wcf-data-services

我正在尝试为Oracle数据库创建WCF数据服务。我正在使用Oracle实体框架适配器并为所有视图创建实体(它是一个只读服务)。我遇到的问题是DateTimeOffset不是受支持的基本类型。

好的,我已经搜索了一下,这不是一个未知的问题,但我找不到答案!我无法编辑视图以更改作为其专有数据库返回的类型。有人提到使用RegisterKnownType(typeof(DateTimeOffset)),但这不起作用。其他人说我需要序列化数据,但不解释如何。

有没有人有关于如何获取WCF数据服务返回的不受支持的基元类型的分步解决方案?

2 个答案:

答案 0 :(得分:0)

Fom Data Contract Known Types

  

与其他基本类型不同,DateTimeOffset结构不是   默认情况下已知类型,因此必须手动将其添加到列表中   已知类型。

本文档以及KnownTypeAttribute Class描述了如何添加到已知类型列表中。

Open Data Protocol by Example还提到了DateTimeOffset类型。

答案 1 :(得分:0)

Best work around to fix DateTimeOffset over WCF Data Service issue类似

  

这是一个使用反射的黑客攻击,但是在应用程序启动时使用以下内容(我使用WebActivator)到目前为止使用的是2011年10月的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());