如何在ASP.NET Web API(或一般的REST)中添加/更新类集合导航属性

时间:2013-04-26 06:40:10

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

这是我正在处理的Web API项目特有的设计问题,但它可能是REST原则的一般问题。我也可能完全过分思考这个问题。

我在Entity Framework中有一个类,它有另一个类的子集合:

public abstract class Tracker
{
    [Key]
    public int ID { get; set; }

    [MaxLength(50)]
    public string Name { get; set; }

    public virtual ICollection<Unit> Units { get; set; }      
}

Unit类看起来像这样:

public class Unit
{
    [Key]
    public int ID { get; set; }

    [MaxLength(50)]
    public string Name { get; set; }
}

我正在开发一个Web API,它将获取跟踪器列表,并获取可用单元列表,然后将一个特定单元添加到跟踪器的单元列表中。跟踪器和单元有自己的API控制器和存储库,我试图弄清楚如何修改它们以支持创建这种关联,以及请求的样子。

是否适合通过PUT更新Tracker端点(/ Trackers / 1)以将新单元添加到列表中,可能与现有单元一起添加?我该如何处理后端?我认为我对PUT方法的一个心理障碍是 - 我会将整个子对象包含在请求正文集合属性中吗?它没有意义,但我不确定它会如何起作用。假设(在我的情况下)将是添加到跟踪器列表中的单元将是已存在的单元,我们只是创建关联。我是否可以使用DTO来实现这两个目标,并相应地映射它们?

或者更有意义的是创建一个新的联合DTO,例如“TrackerUnit”,其具有相应的端点,我可以通过POST到该端点(POST / TrackerUnits)来添加新的关联,然后在新的控制器中处理它?我认为它还需要支持DELETE来删除项目。我并不为这种方法感到疯狂,因为这个端点不会对应我系统中的任何实际资源,而只是用于映射这些关联。

1 个答案:

答案 0 :(得分:5)

如何创建端点:

/Trackers/{id}/units

然后您可以将一个单元发布到此端点以与{id}标识的跟踪器关联,或类似地:

DELETE /Trackers/{id}/Units/{unitid}

删除单位。