4

我在 MVC 5 的新 Web API 上使用 OData 服务,但遇到了一些问题。

我已按照本教程开始开发 OData 服务,并且几乎一切正常。项目构建,路由工作,并且 URL 工作得很好。

我的一个类被调用Post并具有类型Dictionary<string, object>为 named的属性Parameters,如下所示:

public partial class Post : IPost
{
    public Guid Id { get; set; }

    public string Author{ get; set; }  
    public string Content{ get; set; }  
    public DateTime PostedDate{ get; set; }  
    public List<Photo> Pictures { get; set; }  

    public Dictionary<string, object> Parameters { get; set; }  
}

当我在浏览器中执行获取请求时,列出所有Post对象 ( ) 的 URL 工作正常。http://localhost/odata/Posts所有对象都已成功序列化。

但是在另一个应用程序中将 OData 元数据作为服务参考导入,当我获得Post实体列表时,我收到以下错误:

Microsoft.Data.OData.dll 中出现“System.InvalidOperationException”类型的异常,但未在用户代码中处理

附加信息:“WebApplication1.ServiceReference2.System.Collections.Generic.KeyValuePair_2OfString_Object”类型没有可设置的属性。

如何成功解决此问题以导入服务引用?

4

3 回答 3

9

几天后,我尝试了很多不同的测试。

  • Dictionary<string, object>=> 抛出原始错误
  • Dictionary<string, string>=>同样的错误
  • List<KeyValuePair<string, object>>=>同样的错误
  • List<KeyValuePair<string, string>>=>同样的错误

我意识到KeyValuePair班级是问题所在,但我不知道为什么。

所以,我创建了一个Parameter如下命名的类:

public class Parameter
{
    public string Key { get; set; }
    public string Value { get; set; }
}

...我将列表类型更改为List<Parameter>并且它有效!

仔细思考问题后,我意识到错误中的一个重要句子:

'WebApplication1.ServiceReference2.System.Collections.Generic.KeyValuePair_2OfString_Object' 没有可设置的属性

字典只不过是 KeyValue 对的列表,并且该KeyValuePair<TKey, TValue>结构有两个属性,名为“Key”和“Value”,它们只有 get 访问器。所以,它们是只读的。

由于某种我还不知道的原因,我们可能会得出结论 OData 服务参考无法反序列化只读属性。

我的解决方法奏效了,但我想知道服务参考是否有朝一日可以通过反射方式来设置此属性。

于 2013-11-21T07:02:52.540 回答
5

对于自 > 2015 年以来阅读此内容的任何人:OData V4 支持开放类型:https ://docs.microsoft.com/en-us/aspnet/web-api/overview/odata-support-in-aspnet-web-api/ odata-v4/使用-open-types-in-odata-v4

您的字典应该是以下类型:

IDictionary<string, object>.

然后,Odata 将为您创建一个开放类型。

于 2018-09-19T10:06:13.153 回答
1

web API OData 还不支持开放类型,我认为这是您正在寻找的。Dictionary<string, object>在 EDM 中不能很好地建模。

您能否进一步解释 Post.Parameters 应该包含哪些内容,以查看是否有更好的方法来为 Post 类型建模?

于 2013-11-14T00:03:32.987 回答