【发布时间】:2013-02-06 19:41:34
【问题描述】:
在我们的 ASP.net Web API 背后,我们有一个代码优先实体框架模型。考虑以下(简化的)实体:
public class Form
{
public long Id { get; set; }
public string Identifier { get; set; }
public virtual FormGroup Group { get; set; }
}
public class FormGroup
{
public long Id { get; set; }
public string Identifier { get; set; }
public virtual ICollection<Form> Forms { get; set; }
}
如您所见,FormGroups 和 Forms 之间存在一对多的关系。我的问题是,应该如何设计一个允许我们更改表单所属组的 RESTful API?
到目前为止,我提出了两种可能的方法,各有利弊:
将关系表示为链接结构:
{
"Id" : 1,
"Identifier" : "Form1",
"link" : {
"rel": "http://myapi/res/formgroup",
"href": "http://myapi/formgroups/1"
}
}
优点:
- 包含指向表单组表示的有意义的链接
缺点:
- 此类链接没有特定的标准
- 服务器端逻辑变得更加复杂
使用 PUT 将资源链接在一起
data: {
"Id" : 1,
"Identifier" : "Form1"
}
PUT data to http://myapi/formgroups/1/forms
优点:
- 表示没有无关的属性
缺点:
- 资源可以由多个 URI 标识,即 /forms/1 和 /formgroups/1/forms/1
- 发送任何不是形成密钥所需的数据都是无关紧要的,或者是令人困惑的
我对这两种方法都不是特别满意,因为它们的缺点似乎都比优点多。
我知道一个“正确”的解决方案是实现 DTO 并将我的实体模型与我的资源表示分离,这将允许我添加一个我可以设置的 FormGroupId。
像所有优秀的程序员一样,但我很想知道这是如何在 RESTful API 中工作的。我还想要一个可以通用地应用于我的模型中的任何导航属性的解决方案。
明信片上的答案...这些方法中的任何一种是否有效,或者是否有其他方法可以做我错过的事情?
皮特
【问题讨论】:
标签: c# entity-framework rest asp.net-web-api