客户端Win8.1通用应用程序上的OData Expand失败

时间:2014-10-14 00:22:25

标签: c# odata win-universal-app

一个简单的问题,Win 8.1通用类库中是否不支持此功能?或者如果是的话,任何人都可以帮助我做错了。

http://jbsapplication.azurewebsites.net/Modules?$filter=Name%20eq%20'JBS%20Electronic%20forms'&$expand=Menus

当我从浏览器或Fiddler这样做时,我收到了正确的回复。

我在客户端视图模型类中的代码如下(使用OData Client v2代码生成的对象)

var application = new UriBuilder(ServiceBaseAddress);
var context = new Models.Application(application.Uri);

var modulesQuery = context.Modules.Expand(m=>m.Menus).Where(m => m.Name == ApplicationName);
var modules = await ((DataServiceQuery<Module>) modulesQuery).ExecuteAsync();
_currentModule = modules.FirstOrDefault();

在最后一行生成以下异常

类型&#39; Microsoft.OData.Core.ODataException&#39;的第一次机会异常。发生在Microsoft.OData.Core.DLL

附加信息:编写JSON响应时,必须指定用户模型,并且必须将实体集和实体类型传递给ODataMessageWriter.CreateODataEntryWriter方法,或者必须在正在写入的ODataEntry或ODataFeed上设置ODataFeedAndEntrySerializationInfo。

如果我删除请求的展开部分,一切都很好,但我需要再执行一次往返获取菜单。

Module类的减少参考:

[Key("Id")]
public class Module: BindableBase
{
    public string Name
    {
        get { return _name; }
        set { SetProperty(ref _name, value); }
    }

    DataServiceCollection<Menu> _menus = new DataServiceCollection<Menu>(null,TrackingMode.AutoChangeTracking);

    public DataServiceCollection<Menu> Menus
    {
        get { return _menus; }
        set
        {
            _menus = value;
            OnPropertyChanged("Menus");
        }
    }
}

2 个答案:

答案 0 :(得分:5)

当我忘记将扩展实体作为EntitySet添加到ODataModelBuilder时,我遇到了您描述的问题。在ASP.NET OData Web API中尝试这个:

builder.EntitySet<Menus>("Menus");

答案 1 :(得分:0)

具有ID属性的模型需要由客户端显式扩展,并且需要将可扩展模型注册为实体集,并使用自动生成的OData客户端的构建器来调用expand。