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
.
我认为这是因为 Customer
和 Order
都注册为 EntitySet,所以 OData 希望在它们嵌套时提供扩展参数。有没有办法让 OrderCustomer
属性 自动扩展(即不需要提供扩展参数)?我对 OData/Edm 模型的理解非常初级,因此不胜感激。
您的流畅配置是正确的,对于 OData v4,这将适用于 collection 和 item 查询。
如果它不适合您,可能有 3 个问题:
您似乎没有对 item 查询使用 OData v4 URL 约定,在 v4 中预期的 URL 是:
/Orders({Id})
这让人质疑您如何修改路由器以支持 v3 语法,关于如何实现 v3 路由有多种变体,因此在这方面所做的更改可能会影响默认扩展和选择的方式已应用,或者是否应应用。
您可能没有包括您的数据查询中的导航数据。如果数据不是从数据存储中检索到的,那么按理说它不会出现在输出记录集中。如果您手动使用 ODataQueryOptions.ApplyTo()
将用户请求应用于您的查询,那么这将不会考虑模型上的配置,它只会 应用 查询选项来电者已指定。
调用方可能正在指定一个 Empty $expand=
,这将取消自动配置。即使原始调用者没有指定任何查询选项,OData API 也很常见,可以使用标准或自定义中间件 运行 来处理请求查询字符串。要验证 URL 未被篡改,请将其记录在您的 GET
方法处理程序中并确保未指定 $expand
。
- 与上一点一样,如果您
GET
方法中的 ODataQueryOptions
参数应该 NOT 显示 SelectExpand
的任何值希望应用 auto 配置。
最后,最后要检查的地方是您没有覆盖默认值 EnableQueryAttribute
。如果您已经实现了自己的 EnableQueryAttribute
自定义实现,那么请确保您仍然调用基本实现以正确应用 ODataQueryOptions
AND 架构默认为底层IQueryable
结果。
我使用的是 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
.
我认为这是因为 Customer
和 Order
都注册为 EntitySet,所以 OData 希望在它们嵌套时提供扩展参数。有没有办法让 OrderCustomer
属性 自动扩展(即不需要提供扩展参数)?我对 OData/Edm 模型的理解非常初级,因此不胜感激。
您的流畅配置是正确的,对于 OData v4,这将适用于 collection 和 item 查询。
如果它不适合您,可能有 3 个问题:
您似乎没有对 item 查询使用 OData v4 URL 约定,在 v4 中预期的 URL 是:
/Orders({Id})
这让人质疑您如何修改路由器以支持 v3 语法,关于如何实现 v3 路由有多种变体,因此在这方面所做的更改可能会影响默认扩展和选择的方式已应用,或者是否应应用。
您可能没有包括您的数据查询中的导航数据。如果数据不是从数据存储中检索到的,那么按理说它不会出现在输出记录集中。如果您手动使用
ODataQueryOptions.ApplyTo()
将用户请求应用于您的查询,那么这将不会考虑模型上的配置,它只会 应用 查询选项来电者已指定。调用方可能正在指定一个 Empty
$expand=
,这将取消自动配置。即使原始调用者没有指定任何查询选项,OData API 也很常见,可以使用标准或自定义中间件 运行 来处理请求查询字符串。要验证 URL 未被篡改,请将其记录在您的GET
方法处理程序中并确保未指定$expand
。- 与上一点一样,如果您
GET
方法中的ODataQueryOptions
参数应该 NOT 显示SelectExpand
的任何值希望应用 auto 配置。
- 与上一点一样,如果您
最后,最后要检查的地方是您没有覆盖默认值 EnableQueryAttribute
。如果您已经实现了自己的 EnableQueryAttribute
自定义实现,那么请确保您仍然调用基本实现以正确应用 ODataQueryOptions
AND 架构默认为底层IQueryable
结果。