Web Api和关系数据

时间:2014-02-27 15:07:36

标签: json asp.net-web-api entity-framework-5

我在visualstudio中生成了一个WebApi,用于角度前端。它用于存储和提供有关会议的数据。每次会议都可以有一个或多个议程点。现在HTTP GET给了我JSON,如:

[
    {
        "Agendapunten": [
            {
                "Id": 1,
                "Omschrijving": "Omschrijving 1",
                "VolgNr": 2,
                "VergaderingenId": 1
            },
            {
                "Id": 3,
                "Omschrijving": "Omschrijving 2",
                "VolgNr": 1,
                "VergaderingenId": 1
            }
        ],
        "Id": 1,
        "Datum": "2014-02-05T00:00:00",
        "Status": 5
    },
    {
        "Agendapunten": [
            {
                "Id": 11,
                "Omschrijving": "Omschrijving 3",
                "VolgNr": 4,
                "VergaderingenId": 20
            }
        ],
        "Id": 20,
        "Datum": "2014-02-05T00:00:00",
        "Status": 5
    }
]

当我使用POST添加会议或使用PUT更新会议字段时,一切正常。作为一个WebApi / JSON newby,我期望以几乎相同的方式更新agendapoints(agendapunten in dutch):在上面提到的JSON结构中放入一个新值并将其发送到WebApi ...发送此请求后数据库中没有任何变化。

有人能指出我正确的方向吗?我怀疑我必须构建一个单独的WebApi来检索和更新agendapoints。或者使用不同的调用方法做一些事情,比如

http://webserveraddress/api/meeting/1/agendapoints (GET)
Http://webserveraddress/api/meeting/1/agendapoints/1 { new values} (PUT)

我希望我的问题很清楚,尽管我的英语很差......

1 个答案:

答案 0 :(得分:1)

简短回答:不,您不必为议程定义单独的API服务。您可以通过会议资源与其进行交互:

e.g。 api / meetings / {id} 服务将采用您的会议对象(包括议程)并保存会议,但也会注意找出对象中不再包含哪些议程,从而将其从db,哪些是新的,因此添加它们,哪些被更改,从而更新它们。 E.g。

//api/meetings/{id} - PUT
public HttpResponse Update(int id, Meeting meeting)
{
  db.update(id, meeting);
  foreach (var agenda in meeting.agendas)
  {
    if (db.exists(agenda))
    {
      agenda.update()
    } 
    else
    {
      agenda.insert()
    }
    //also take care of deleting agendas no longer there
  }
}

有些人可能反对这种方法并建议定义一个单独的资源Url;其他人可能同意并说,其核心议程实际上只是会议的延伸,这意味着如果议程发生变化,会议就会发生变化。

要将议程作为单独的资源,您需要定义一个全新的Agendas控制器,该控制器将与 api / agendas / {id} url上的议程进行交互。 E.g。

public class AgendasController
{
  //api/agendas/{agendaId} - PUT
  public HttpResponse Update(int agendaId, Agenda agenda)
  {
    db.update(agendaId, agenda);
  }
}

您可能还希望在MeetingsController上使用议程方法,并将路线定义为 api / meetings / {meetingId} / agendas / {agendaId} - 就像您在问题的底部一样。如果您使用基于约定的路由,则定义路线可能有点棘手。在Web API 2中,您可以使用属性路由来简化这种路由。

有关属性路由的详细信息,请参阅此文章:http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2