我有一个对象列表。这些对象及其某些属性显示在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);
}
我可以删除所有项目并重新添加它们,但是我认为这是不正确的方法。有什么方法可以比较,仅添加/更新更改/缺少元素?
答案 0 :(得分:1)
这只是我的观点,如果难以实现,也许是因为该方法尝试做太多事情。
这种方法将使代码杂乱无章,且出现维护问题。
更好的方法是将其分为创建,更新和删除3种方法。
然后将此操作直接放在数据网格的行上或捕获数据网格更改的事件,以将更改正确地应用于视图中的保存方法。
答案 1 :(得分:0)
您不想删除并重新添加实体,它们实际上可能会删除数据库中的内容并重新添加新的实体。
您可以遍历对象以找到两个对象(更新),目标中而不是源中的对象(删除)以及源中而不是目标中的对象(创建)。进行时,您可以在db上下文中进行更改,然后保存更改。
答案 2 :(得分:0)
您可以使用类似AutoMapper.org之类的东西,取出要编辑的数据库对象的集合,与自动映射器合并,然后保存更改。
答案 3 :(得分:0)