WCF 数据服务和非基本类型

发布于 2024-12-10 21:15:54 字数 302 浏览 0 评论 0原文

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

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

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

I am trying to create a WCF dataservice for an Oracle database. I'm using the Oracle entity framework adapter and creating entities for all the views (its a read only service). The problem that I am encountering is that DateTimeOffset is not a supported primitive type.

OK, I've googled a fair bit and this is not an unknown problem but I can't find an answer! I can't edit the views to change the type returned as its a proprietary database. Some people have mentioned using RegisterKnownType(typeof(DateTimeOffset)) but this doesn't work. Other people have said I need to serialise the data but don't explain how.

Does anyone have a step by step solution as to how to get unsupported primitive types returned by WCF data services?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

月隐月明月朦胧 2024-12-17 21:15:55

类似于 通过 WCF 修复 DateTimeOffset 的最佳解决方法数据服务问题

使用反射有点破解,但将以下内容放入应用程序启动中(我使用了 WebActivator< /a>) 到目前为止,我使用的是 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());

Similar to Best work around to fix DateTimeOffset over WCF Data Service issue

It's a bit of a hack using reflection, but putting the following in the application start up (I used WebActivator) has so far worked for me using October 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());
岁月苍老的讽刺 2024-12-17 21:15:54

数据合同已知类型

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

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

开放数据协议示例还提到了 DateTimeOffset 类型。

Fom Data Contract Known Types:

Unlike other primitive types, the DateTimeOffset structure is not a
known type by default, so it must be manually added to the list of
known types.

This document as well as KnownTypeAttribute Class describe how to add to the list of known types.

Open Data Protocol by Example also mentions the DateTimeOffset type.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文