【问题标题】:OData EDM model - auto-expanding a nested Entity TypeOData EDM 模型 - 自动扩展嵌套实体类型
【发布时间】:2021-11-15 10:46:00
【问题描述】:

我使用的是 OData v4,并且这些模型是使用 EdmModel Builder 为我们的 .NET Web API 配置的。

我有两个这样定义的模型:

public class Customer
{
    public int CustomerId { get; set; }
    public string CustomerName { get; set; }
}

public class Order
{
    public int OrderId { get; set; }
    public string Category { get; set; }
    public Customer OrderCustomer { get; set;}
}   

这些模型都有对应的控制器,注册如下:

builder.EntitySet<Customer>("Customers")
          .EntityType
          .HasKey(x => x.CustomerId);

builder.EntitySet<Order>("Orders")
          .EntityType
          .HasKey(x => x.OrderId)
          .Expand(
            maxDepth: 2,
            expandType: SelectExpandType.Automatic,
            properties: nameof(Order.OrderCustomer));

我能够向这两个端点发出 OData 请求,如下所示: /Customers/{Id}/Orders/{Id}.

我希望当我查询Orders 时,嵌套的EntitySet Customers 将自动扩展,因为我在Order EntitySet 上设置了expandType: SelectExpandType.Automatic。但是,我无法让 CustomerOrder 属性在 Customer 上自动扩展,我必须使用扩展参数调用请求:

/Orders/{Id}?$expand=OrderCustomer.

我认为这是因为CustomerOrder 都注册为EntitySets,所以OData 期望在嵌套时提供扩展参数。有没有办法让OrderCustomer 属性自动展开(即不需要提供展开参数)?我对 OData/Edm 模型的理解非常初级,因此不胜感激。

【问题讨论】:

    标签: asp.net-web-api odata


    【解决方案1】:

    您的 fluent 配置是正确的,对于 OData v4,这将适用于 collectionitem 查询。

    如果它不适合您,则可能有 3 个问题:

    1. 您似乎没有对 item 查询使用 OData v4 URL 约定,在 v4 中,预期的 URL 是:

      /Orders({Id})
      

      这带来了您如何修改路由器以支持 v3 语法的问题,如何实现 v3 路由有多种变化,因此在此区域中所做的更改可能会影响应用默认扩展和选择的方式,或者是否应该适用。

    2. 您的数据查询中可能包括导航数据。如果未从数据存储中检索数据,则按理说它不会出现在输出记录集中。如果您手动使用ODataQueryOptions.ApplyTo() 将用户请求应用于您的查询,那么这不会考虑模型上的配置,它只会应用调用者指定的查询选项。

    3. 调用者可能正在指定一个 Empty $expand=,这将取消自动配置。即使发起调用者没有指定任何查询选项,OData API 也很常见,运行标准或自定义中间件可能会操纵请求查询字符串。要验证 URL 未被篡改,请将其记录在您的 GET 方法处理程序中,并确保未指定 $expand

      • 与前一点一样,如果您想要 auto 配置,GET 方法中的 ODataQueryOptions 参数应该显示 SelectExpand 的任何值应用。

    最后,要检查的最后一个地方是您没有覆盖默认的EnableQueryAttribute。如果您已经实现了自己的 EnableQueryAttribute 自定义实现,请确保您仍然调用基本实现以正确应用 ODataQueryOptions AND 架构默认为基础 IQueryable 结果。 p>

    【讨论】:

      猜你喜欢
      • 2020-10-06
      • 2023-01-10
      • 1970-01-01
      • 1970-01-01
      • 2019-05-29
      • 2014-07-31
      • 2020-07-22
      • 1970-01-01
      • 2016-06-10
      相关资源
      最近更新 更多