【问题标题】:Foreign Keys in Web API 2 - Best practices?Web API 2 中的外键 - 最佳实践?
【发布时间】:2014-10-08 14:13:37
【问题描述】:

基本上我在后端使用 Web API 2 和实体框架编写 API。

我不确定如何处理模型上的外键。

假设我有一个 person 属性,其中包含一个 order 属性的外键。

有时客户端需要 person 属性,有时不需要。我该怎么办?

我是否应该创建 2 个方法: /api/person/1

在我看来似乎有很多方法。

我知道 queryable 属性也存在,它支持客户端使用 $extend 参数随意包含属性 - 但是如果可以避免的话,我宁愿不使用 queryable 属性。

你有什么建议?

【问题讨论】:

  • 如果你需要两种不同的东西,为什么有两种方法是“可怕的很多”?你也可以传入一个标志参数来返回订单
  • 为什么不总是简单地返回带有 order 属性的人,让客户按照他们的意愿去做呢?或者如果这不正确,请在您的调用中添加一个标志,如果为 true 将返回 order 属性,如果不是则不会?
  • @DavidG 谢谢。我最终使用标志来允许客户端指定是否包含属性。
  • @theDarse 我不想包含总是看到的订单,因为它会增加不必要的带宽。

标签: entity-framework rest asp.net-web-api asp.net-web-api2


【解决方案1】:

在我的脑海中,这里有一些选项。

选项 1

API 中的多个方法

public Person GetPerson() { ... }
public Person GetPersonWithOrders() { ... }

选项 2

将标志传递给方法:

public Person GetPerson(bool getOrders) { ... }

选项 3

您可以使用OData 允许调用者查询数据。

【讨论】:

  • 感谢您的回复。选项一可能会使我的 API 变得非常混乱,因为它会暴露一大堆方法。我喜欢选项 2 - 我想我可以选择。
【解决方案2】:

要扩展 DavidG 使用 OData 的选项 3,您可以这样做:

  1. Install-package Microsoft.AspNet.WebApi.OData

  2. 创建一个继承自ODataControllerPeopleController

  3. 像这样配置 Web API OData 模型:

    modelBuilder.EntitySet<Person>("People");

  4. Get 方法定义为返回IQueryable<Person>

  5. 在您的调用代码中,将 expand 子句添加到 URL 以指定您要公开的子对象,如下所示:/api/People(1)?$expand=Orders

关于注册 OData 路由还有更多内容,但这是您可以在任何 sample project 中找到的所有标准配置。

OData 确实非常灵活,可以解决有关如何构建 URL 的大量问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    • 2017-07-19
    • 1970-01-01
    相关资源
    最近更新 更多