2013-08-08 6 views
2

Чтобы обновить объект, я использую HTTP PUT, передав обновленный объект в теле запроса:Создание, обновление, удаление дочерних объектов с .net WebAPI

PUT /api/flareform/3

{ 
    "JobId" : "12-12-4004", 
    "Id" : 3, 
    "Tasks" : [ 
     { 
     "Hazard" : "Clumsyness", 
     "Id" : 2, 
     "FlareFormId" : 3, 
     "Task" : "Hammering", 
     "Control" : "Make Someone Else Hold the Nail" 
     }, 
     { 
     "Hazard" : "Nails", 
     "Id" : 3, 
     "FlareFormId" : 3, 
     "Task" : "Walking", 
     "Control" : "Keep area clean." 
     } 
    ], 
    "PercentComplete" : null, 
    "Time" : "3pm", 
    "Initials" : "JD" 
} 

Это работает правильно, если я обновляю простое свойство объекта, например Инициалы. Возможно ли/как мне обновить, добавить, удалить Задачи. Можете сделать это через этот объект? То, что я хотел бы сделать, это просто передать обновленный массив задач и его обновить/удалить/добавить все:

PUT /api/flareform/3

{ 
    "JobId" : "12-12-4004", 
    "Id" : 3, 
    "Tasks" : [ 
     { 
     "Hazard" : "NewAndImprovedValue", 
     "Id" : 2, 
     "FlareFormId" : 3, 
     "Task" : "NewAndImprovedValue", 
     "Control" : "NewAndImprovedValue" 
     }, 
     { 
     "Hazard" : "SomeNewItemThatDidntExistBefore", 
     "FlareFormId" : 3, 
     "Task" : "NoteTheMissingId", 
     "Control" : "ShouldAddThisOne" 
     } 
    ], 
    "PercentComplete" : null, 
    "Time" : "3pm", 
    "Initials" : "JD" 
} 
+0

Можете ли вы включить определение DTO на стороне сервера? (Класс I.E. C# или VB.net) –

ответ

1

Вот более или менее то, что я в конечном итоге с помощью. Я пытаюсь написать это более общим образом, так что мне не нужно копировать/вставлять этот код для каждого дочернего объекта, который должен быть обновляемым ...

// PUT api/FlareForm/5 
    public HttpResponseMessage PutFlareForm(int id, FlareForm flareform) 
    { 
     if (!ModelState.IsValid) 
     { 
      return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState); 
     } 

     if (id != flareform.Id) 
     { 
      return Request.CreateResponse(HttpStatusCode.BadRequest); 
     } 


     List<int> previousIds = db.FlareForms.AsNoTracking().FirstOrDefault(ff => ff.Id == id).Tasks.Select(t => t.Id).ToList(); 
     List<int> currentIds = flareform.Tasks.Select(t => t.Id).ToList(); 
     List<int> deletedIds = previousIds 
      .Except(currentIds).ToList(); 


     foreach (var deletedId in deletedIds) 
     { 
      FlareFormTask task = db.FlareFormTasks 
       .Single(od => od.FlareFormId == flareform.Id && od.Id == deletedId); 

      db.Entry(task).State = EntityState.Deleted; 
     } 

     foreach (var task in flareform.Tasks) 
     { 
      if (task.Id == 0) 
      { 
       task.FlareFormId = flareform.Id; 
       db.Entry(task).State = EntityState.Added; 
      } 
      else 
      { 
       db.Entry(task).State = EntityState.Modified; 
      } 
     } 


     db.Entry(flareform).State = EntityState.Modified; 

     try 
     { 
      db.SaveChanges(); 
     } 
     catch (DbUpdateConcurrencyException ex) 
     { 
      return Request.CreateErrorResponse(HttpStatusCode.NotFound, ex); 
     } 

     return Request.CreateResponse(HttpStatusCode.OK); 
    } 
+0

Я понимаю, что это старо, но я искал другой ответ и наткнулся на это. Это может быть так же полезно для вас, как и для меня: https://github.com/refactorthis/GraphDiff –

2

Ваш объект Json выглядит хорошо. Я считаю, что виновником станет ваш DAL. Поскольку сохранение дочерних объектов не так прямо, как следует думать.

Я предполагаю, что ваш Tasks находятся в отношениях друг к другу с основным объектом. Если это так, вам нужно вручную обнаружить любые изменения (добавленные, удаленные или измененные) и применить их.

Этот учебник поможет вам начать: http://www.entityframeworktutorial.net/update-one-to-many-entities-in-entity-framework.aspx

Смежные вопросы