首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除Asp.Net web 2和实体框架中的子记录

删除Asp.Net web 2和实体框架中的子记录
EN

Stack Overflow用户
提问于 2016-02-22 03:22:45
回答 1查看 146关注 0票数 0

当我想处理Asp.Net web 2中包含一组主记录的添加、删除和编辑子记录(或细节)的更新请求时,我对我无法解决的问题感到沮丧。为了使它更清楚,假设我有以下两个模型类:

代码语言:javascript
复制
public class Order 
{
    public int Id;
    public string Description;
    public decimal Total;

    public virtual ICollection<OrderItems> OrderItems; 
}

和:

代码语言:javascript
复制
public class OrderItem
{
    public int Id;
    public int OrderId;
    public Notes;
}

现在,Order记录的“更新”请求实际上包含了对OrderItem记录的一组编辑、添加和删除操作,因为这些子记录可能以不同的方式进行了修改。

例如,原始订单可能是:

代码语言:javascript
复制
Order: { Id:1, Description:"test", Total:10, 
         OrderItems: [
                         { Id:1, OrderId:1, Notes:"nothing!" },
                         { Id:2, OrderId:2, Notes:"nothing at all!" }
                     ]}

通过PUT请求发送的更新记录可以是:

代码语言:javascript
复制
Order:{Id:1, Description:"test", Total:10, OrderItems:[
  {Id:1, OrderId:1, Notes:"SOMETHING!"},
  {Id:4, OrderId:2, Notes:"just some text..."}
]}

在这种情况下,该PUT请求需要对OrderItem数据库记录进行以下操作:

  • 用orderItem删除Id=2,
  • 添加带有orderItem的Id=4,
  • 用orderItem更新Id=1 (以反映“备注”更改)

我使用以下代码:

代码语言:javascript
复制
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中。

EN

回答 1

Stack Overflow用户

发布于 2016-02-22 12:19:00

在OrderItem类中添加了一个属性,以检测是否删除了记录。

假设IsDeleted as bool和检查IsDeleted标志,并基于标志删除或添加/更新OrderItems。

OrderItem类:

代码语言:javascript
复制
public class OrderItem
{
    public int Id;
    public int OrderId;
    public Notes;
}

原始订单可能是:

代码语言:javascript
复制
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 }
                 ]}

一份原始订单可以是:

代码语言:javascript
复制
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}
]}

在前文中:

代码语言:javascript
复制
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;
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35545304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档