OData EDM 模型 - 自动扩展嵌套实体类型

OData EDM model - auto-expanding a nested Entity Type

我使用的是 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 都注册为 EntitySet,所以 OData 希望在它们嵌套时提供扩展参数。有没有办法让 OrderCustomer 属性 自动扩展(即不需要提供扩展参数)?我对 OData/Edm 模型的理解非常初级,因此不胜感激。

您的流畅配置是正确的,对于 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

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

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