当我想处理Asp.Net web 2中包含一组主记录的添加、删除和编辑子记录(或细节)的更新请求时,我对我无法解决的问题感到沮丧。为了使它更清楚,假设我有以下两个模型类:
public class Order
{
public int Id;
public string Description;
public decimal Total;
public virtual ICollection<OrderItems> OrderItems;
}和:
public class OrderItem
{
public int Id;
public int OrderId;
public Notes;
}现在,Order记录的“更新”请求实际上包含了对OrderItem记录的一组编辑、添加和删除操作,因为这些子记录可能以不同的方式进行了修改。
例如,原始订单可能是:
Order: { Id:1, Description:"test", Total:10,
OrderItems: [
{ Id:1, OrderId:1, Notes:"nothing!" },
{ Id:2, OrderId:2, Notes:"nothing at all!" }
]}通过PUT请求发送的更新记录可以是:
Order:{Id:1, Description:"test", Total:10, OrderItems:[
{Id:1, OrderId:1, Notes:"SOMETHING!"},
{Id:4, OrderId:2, Notes:"just some text..."}
]}在这种情况下,该PUT请求需要对OrderItem数据库记录进行以下操作:
我使用以下代码:
public IHttpActionResult PutOrder(int id, Order order)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
if (id != order.Id)
{
return BadRequest();
}
foreach (OrderItem oi in order.OrderItems)
{
db.Entry(oi).State = oi.Id == 0 ? EntityState.Added : EntityState.Modified;
}
db.Entry(order).State = EntityState.Modified;
try
{
db.SaveChanges();
}
catch (DbUpdateConcurrencyException)
{
if (!OrderExists(id))
{
return NotFound();
}
else
{
throw;
}
}
return StatusCode(HttpStatusCode.NoContent);
}foreach循环完美地处理了add和update部分,但是我没有处理delete部分的工作逻辑。这种情况是,要删除的orderItem甚至不存在于通过请求发送的JSON中。
发布于 2016-02-22 12:19:00
在OrderItem类中添加了一个属性,以检测是否删除了记录。
假设IsDeleted as bool和检查IsDeleted标志,并基于标志删除或添加/更新OrderItems。
OrderItem类:
public class OrderItem
{
public int Id;
public int OrderId;
public Notes;
}原始订单可能是:
Order: { Id:1, Description:"test", Total:10,
OrderItems: [
{ Id:1, OrderId:1, Notes:"nothing!", IsDeleted : false },
{ Id:2, OrderId:2, Notes:"nothing at all!", IsDeleted : false }
]}一份原始订单可以是:
Order:{Id:1, Description:"test", Total:10, OrderItems:[
{Id:1, OrderId:1, Notes:"SOMETHING!",IsDeleted : false},
{ Id:2, OrderId:2, Notes:"nothing at all!", IsDeleted : true }
{Id:4, OrderId:2, Notes:"just some text...",IsDeleted : false}
]}在前文中:
foreach (OrderItem oi in order.OrderItems)
{
if(io.IsDeleted){
d.Entry(oi).state = EntityState.Deleted;
}else{
db.Entry(oi).State = oi.Id == 0 ? EntityState.Added : EntityState.Modified;
}
}
db.Entry(order).State = EntityState.Modified;
try
{
db.SaveChanges();
}
catch (DbUpdateConcurrencyException)
{
if (!OrderExists(id))
{
return NotFound();
}
else
{
throw;
}
}https://stackoverflow.com/questions/35545304
复制相似问题