【问题标题】:OData swallowing objects in navigation property导航属性中的 OData 吞噬对象
【发布时间】:2016-04-26 15:50:14
【问题描述】:

我的 OData 控制器有问题,与我拥有的其他控制器相比,它有点不寻常。它是第一个完全从内存中工作的 - 不涉及数据库。

返回的实体是:

public class TrdRun {

    [Key]
    public Guid Identity { get; set; }

    public TrdTrade [] Trades { get; set; }

TrdTrade 也是一个实体集(如果查询针对数据库)。但在这种特殊情况下,我想从运行中返回所有关联的活跃交易,并且我这样做而不进入数据库。

我的问题?以下代码:

  [ODataRoute]
    public IEnumerable<Reflexo.Api.TrdRun> Get(ODataQueryOptions options) {
        var instances = Repository.TrdInstance.AsEnumerable();
        var runs = new List<Reflexo.Api.TrdRun>();
        foreach (var instance in instances) {
            runs.Add(Get(instance.Identifier));
        }
        return runs;
    }

正确配置运行以初始化交易 - 但 WebApi 决定吞下它们。

有什么方法可以将其配置为“按给定”返回数据而不进行进一步过滤?我知道 AutoExpandAttribute(我想避免这种情况 - 我不希望 API 类标记有 OData 属性),但我没有启用 Query,所以我希望在设置时返回返回数据。

【问题讨论】:

    标签: odata asp.net-web-api2


    【解决方案1】:

    Trades 属性的值没有被序列化,因为ODataMediaTypeFormatter 的默认行为是不遵循导航属性,无论内存中有什么。您可以通过在请求的查询字符串中使用$expand 或在类定义中的Trades 属性上使用AutoExpandAttribute 来覆盖此行为,但这两种方法都需要使用EnableQueryAttribute 装饰您的控制器方法。

    如果您不想这样做,您仍然可以在您的服务配置中以编程方式指定 Trades 的自动扩展,如下所示:

    // Let builder be an instance of ODataModelBuilder or a derived class.
    builder.EntityType<TrdRun>().CollectionProperty(r => r.Trades).AutoExpand = true;
    

    小问题:使用编程方法,如果客户端请求完整元数据(例如,Accept 标头中的 odata.metadata=full),OData 序列化程序将在自动扩展对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多