【发布时间】:2014-10-01 02:39:09
【问题描述】:
我有一个相当大的数据模型,我想通过 OData V4 协议使用 Web API OData 公开它。
基础数据存储在 SQL Server 2012 数据库中。该数据库中有许多 DateTime 列。
当我连接它时,我收到一个错误,即 System.DateTime 不受支持。
所以这是我的问题,我该怎么做才能让我的 DateTime 列显示在 OData 提要中?
注意:我无法返回并将所有列更改为 DateTimeOffset 列。
我尝试在实体框架 edmx 中更改列的类型,但它给了我这个错误:
指定的成员映射无效。 'MyProject.MyEntity' 类型中成员 'MyPropertyHere' 的类型 'Edm.DateTimeOffset[Nullable=False,DefaultValue=,Precision=]' 与 'SqlServer.datetime[Nullable=False,DefaultValue=,Precision=3] 不兼容'MyDataModel.Store.MyEntity' 类型中的成员 'MyColumnName'。
(基本上认为 DateTime 与 DateTimeOffset 不兼容。)
Web API OData 团队真的忽略了所有需要使用DateTime 的 SQL Server 类型的人吗?
更新:我找到了解决方法,但它们需要更新 EF 模型才能工作。如果可以避免的话,我宁愿不必单独更新数百个属性。
更新:这个问题让我意识到微软管理其 OData 产品的方式存在严重缺陷。有很多问题,但这个是最明显的。 Web API OData 中有大量缺失的功能。 Transactions 和 ordering of inserts 是其中两个。这两个项目(在 OData 规范中并且在微软杀死它之前在 WCF 数据服务中)对于任何实际系统都至关重要。
但是,他们决定将时间花在删除对许多开发人员非常有帮助的功能上,而不是将时间花在那些缺少 OData 规范中的功能的关键点上。 它集中体现了管理不善,优先考虑删除工作功能而不是添加急需的功能。
我尝试与 Web API OData 代表讨论这些问题,最后,我打开了一个问题/票证,几天后又关闭了。这就是他们愿意做的事情的结束。
正如我所说,Web API OData 的管理还有很多问题(与 DateTime 无关,因此我不会在此列出)。 我一直是 OData 的坚定支持者,但 Web API OData 管理方面的明显问题迫使我和我的团队/公司放弃它。
幸运的是,普通的 Web API 可以设置为使用 OData 语法。设置控制器需要做更多的工作,但最终效果很好。它支持日期时间。 (而且似乎拥有至少可以避免做出疯狂错误决定的管理层。)
【问题讨论】:
-
目前web api odata 不支持DateTime,也许会有修复。有一个类似的问题与解决方法,希望这将有助于stackoverflow.com/questions/24829422/…>
-
实际上人们要求禁止
DateTime(request here)。您确定您的 客户端 时区与服务器的时区相同吗?使用任何时间数据类型而不指定时区只是自找麻烦。这是另一类本地化问题,类似于假设某个代码页、日期格式或十进制字符。需要修复的是模型,而不是 OData 协议 -
@PanagiotisKanavos - 我很确定。
-
@PanagiotisKanavos - 我们受到其他(更大的应用程序)的限制,只能使用我们的时区。通过一个小时的停机时间可以轻松处理夏令时。现实世界的场景很少像规范设计者想的那样简单粗暴。如果我现在有幸创建一个新应用程序,我会使用 DateTimeOffset 吗?当然。但是我们现在很好地管理了日期时间问题。不要忘记,时区已经存在了几十年,但在 OData 中仅支持 DateTimeOffset 仅几年。认为没有其他方法可以处理它是天真的。
-
@Vaccano 相当!! (我完全同意)我的客户端应用程序都经过精心设计和构建,以假设它是什么日期/时间 - 他们从服务器获取这些信息,直到半小时前(当我从 odata 3 更新到 4 时)我的日子过得很顺利。多么痛苦。
标签: .net odata asp.net-web-api asp.net-web-api-odata odata-v4