C# 使用.net WebAPI创建、更新和删除子实体
要更新实体,我使用http PUT,将更新的对象作为请求主体传递:C# 使用.net WebAPI创建、更新和删除子实体,c#,.net,json,entity-framework,asp.net-web-api,C#,.net,Json,Entity Framework,Asp.net Web Api,要更新实体,我使用http PUT,将更新的对象作为请求主体传递: PUT/api/flareform/3 { "JobId" : "12-12-4004", "Id" : 3, "Tasks" : [ { "Hazard" : "Clumsyness", "Id" : 2, "FlareFormId" : 3, "Task" : "Hammering", "Control" :
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"
}
{
"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"
}
如果我更新对象的一个简单属性(如首字母),这将正常工作。是否可以/如何更新、添加和删除任务。你能通过这个物体做到吗?我想做的只是传递一个更新的任务数组,并让它更新/删除/添加所有内容:
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"
}
{
"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"
}
您的Json对象看起来不错。我相信罪魁祸首是你的朋友。正如拯救子实体并不像人们想象的那么简单 我假设您的
任务
与主对象存在一对多关系。如果是这样,您需要手动检测任何更改(添加、删除或修改)并应用它们
本教程应该让您开始学习:以下是我最终使用的内容。我正在尝试以一种更通用的方式编写此代码,这样我就不必为每个需要更新的子属性复制/粘贴此代码
// 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);
}
//PUT api/FlareForm/5
公共HttpResponseMessagePutFlareForm(int id,FlareForm FlareForm)
{
如果(!ModelState.IsValid)
{
返回请求.CreateErrorResponse(HttpStatusCode.BadRequest,ModelState);
}
if(id!=flareform.id)
{
返回请求.CreateResponse(HttpStatusCode.BadRequest);
}
列出以前的Id=db.FlareForms.AsNoTracking().FirstOrDefault(ff=>ff.Id==Id).Tasks.Select(t=>t.Id).ToList();
List currentIds=flareform.Tasks.Select(t=>t.Id.ToList();
列表deletedIds=以前的ID
.除(currentID).ToList()外;
foreach(deletedIds中的deletedId变量)
{
FlareFormTask任务=db.FlareFormTasks
.Single(od=>od.FlareFormId==flareform.Id&&od.Id==deletedId);
db.Entry(task).State=EntityState.Deleted;
}
foreach(flareform.Tasks中的var任务)
{
如果(task.Id==0)
{
task.FlareFormId=flareform.Id;
db.Entry(task).State=EntityState.Added;
}
其他的
{
db.Entry(task).State=EntityState.Modified;
}
}
db.Entry(flareform).State=EntityState.Modified;
尝试
{
db.SaveChanges();
}
捕获(DbUpdateConcurrencyException ex)
{
返回请求.CreateErrorResponse(HttpStatusCode.NotFound,ex);
}
返回Request.CreateResponse(HttpStatusCode.OK);
}
能否在服务器端包含DTO的定义?(即c#,或VB.net类)我意识到这很古老,但我在寻找另一个答案时偶然发现了这一点。这可能对你和我都很有用: