我已阅读并成功实施了解决方案,以支持OData中的复合键,如中所述
http://code.msdn.microsoft.com/Support-Composite-Key-in-d1d53161
但是这个问题与具体问题无关,因为CompositeKeyRoutingConvention类甚至没有被击中。
我的问题是,如果模型中的一个主键字段是datetimeoffset(支持的基本类型),则客户端生成的Uri在路由之前无法识别并失败。
例如:
GET http://myserver.com:12345/odata/HospitalPens(Pen='C7',StartDate=datetimeoffset'2001-06-30T00:00:00%2B10:00')
这是客户端使用主键字段使用WCF DataService调用创建和执行上述请求的方式。
var start = new DateTimeOffset(2001, 6, 30, 0, 0, 0, new TimeSpan(+10, 0, 0)); var gal = container.HospitalPens.Where(c => c.Pen == "C7" && c.StartDate == start).FirstOrDefault();
模型在WebApiConfig
中的Register方法中正确定义了复合键var hospitalPens = builder.EntitySet(" HospitalPens"); hospitalPens.EntityType.HasKey(e => new {e.Pen,e.StartDate});
如果我尝试过滤开始日期,我会得到结果,我期待并且一切都很好。示例调用如下所示
GET http://myserver.com:12345/odata/HospitalPens?$ filter = StartDate%20eq%20datetimeoffset' 2001-06-30T00:00:00'
无法更改数据库密钥,因此我需要解决此问题。提前谢谢。
编辑: 我认为这是OData客户端构建URL的方式的问题。如果密钥有可能包含无效字符,则由于URL验证操作而失败。例如,包含?的字符串键(非常常见),甚至是%和&符号会导致失败。主要问题是字符将出现在URL的查询字符串部分之前,因此会引起问题 但有没有办法可以确保这些生成的URL在发送到浏览器之前有效?这使得odata查询结构在我看来是有缺陷的odata(' key')? url construct不会通过许多请求过滤器。
答案 0 :(得分:0)
尝试删除网址中的datetimeoffset前缀和单引号标记:
GET http://myserver.com:12345/odata/HospitalPens(Pen='C7',StartDate = 2001-06-30T00:00:00%2B10:00)。
或者,尝试逃避网址中的':':
GET http://myserver.com:12345/odata/HospitalPens(Pen='C7',StartDate = 2001-06-30T00%3A00%3A00%2B10%3A00)。
将它翻到浏览器的地址栏。如果以上任何方法有效,请使用以下代码:
var gal = container.Execute("HospitalPens(Pen='c7',StartDate=xxx)");