如何更新实体框架中的元素列表?

时间:2018-11-29 15:18:40

标签: c# .net entity-framework asp.net-web-api

我有一个对象列表。这些对象及其某些属性显示在gridview上。用户可以添加,删除和更改任何选定对象的属性。

更新方法是在“保存”按钮单击事件(不是立即采取的措施)下完成的。

使用实体框架更新Web API 2中可能包括添加的对象,已删除的对象以及属性经过修改的对象的列表的最佳方法是什么?

客户类别:

public class Customer
{
    public int CustomerId { get; set; }
    public string Name { get; set; }
    public string Phone { get; set; }
    public string Email { get; set; }
}

客户类别:

Public Class Customers
{
    public List<Customer> Customers { get; set; }
}

到目前为止为客户提供的PUT方法:

ResponseType(typeof(void))]
public async Task<IHttpActionResult> PutCustomersViewModel(CustomersViewModel custViewModel)
{
   if(!ModelState.IsValid)
       return BadRequest(ModelState);

   // Not sure how to iterate thru the list and update or add accordingly


   _context.Entry(customer).State = EntityState.Modified;

   try
   {
       await _context.SaveChangesAsync();
   }
   catch(DbEntityValidationException ex)
   {
       foreach(var entityValidationErrors in ex.EntityValidationErrors)
       {
           foreach(var validationError in entityValidationErrors.ValidationErrors)
           {
               System.Diagnostics.Debug.WriteLine("Property: " + validationError.PropertyName + " Error: " + validationError.ErrorMessage);
           }
       }
   }
   catch(DbUpdateConcurrencyException)
   {
        return NotFound();

        throw;
    }

    return StatusCode(HttpStatusCode.NoContent);
}

我可以删除所有项目并重新添加它们,但是我认为这是不正确的方法。有什么方法可以比较,仅添加/更新更改/缺少元素?

4 个答案:

答案 0 :(得分:1)

这只是我的观点,如果难以实现,也许是因为该方法尝试做太多事情。

这种方法将使代码杂乱无章,且出现维护问题。

更好的方法是将其分为创建,更新和删除3种方法。

然后将此操作直接放在数据网格的行上或捕获数据网格更改的事件,以将更改正确地应用于视图中的保存方法。

答案 1 :(得分:0)

您不想删除并重新添加实体,它们实际上可能会删除数据库中的内容并重新添加新的实体。

您可以遍历对象以找到两个对象(更新),目标中而不是源中的对象(删除)以及源中而不是目标中的对象(创建)。进行时,您可以在db上下文中进行更改,然后保存更改。

答案 2 :(得分:0)

您可以使用类似AutoMapper.org之类的东西,取出要编辑的数据库对象的集合,与自动映射器合并,然后保存更改。

答案 3 :(得分:0)

按照@Jouan Antoine所说的方式执行...每个CRUD活动的按钮或检查实体状态:

 switch (custViewModel.State)
 {
    case State.Added:
     break;
    case State.Unchanged:
     break;
    case State.Modified:
    break;
    case State.Deleted:
    break;
    case State.Detached:
    break;
  }

您的网格:

enter image description here