使用EntityFramework 6,我想在以下场景中更新客户信息:
这是我的编辑-ActionMethod:
public class Customer
{
public int Id {get; set;}
// 100 more scalar properties
public virtual IList<Consultant> Consultants {get;set;}
}
public class Consultant
{
public int Id {get; set;}
public virtual IList<Customer> Customers{get;set;}
}
这是我为编辑视图创建的ViewModel:
public class CustomerViewModel
{
public string[] SelectedConsultants { get; set; }
public IEnumerable<Consultants> AllConsultants{ get; set; }
public Customer Customer{ get; set; }
}
这是我的编辑-ActionMethod:
[HttpPost]
public ActionResult Edit(CustomerViewModel vm)
{
if (ModelState.IsValid)
{
// update the scalar properties on the customer
var updatedCustomer = vm.Customer;
_db.Customers.Attach(updatedCustomer );
_db.Entry(updatedCustomer ).State = EntityState.Modified;
_db.SaveChanges();
// update the navigational property [Consultants] on the customer
var customer = _db.Customers
.Include(i => i.Customers)
.Single(i => i.Id == vm.Customer.Id);
Customer.Consultants.Clear();
_db.Consultants.Where(x => vm.SelectedConsultants
.Contains(x.Id)).ToList()
.ForEach(x => customer.Consultants.Add(x));
_db.Entry(customer).State = EntityState.Modified;
_db.SaveChanges();
return RedirectToAction("Index");
}
return View(vm);
}
这个方法可以更新标量属性和顾问的编辑视图。但是,在我的控制器中,我要做两个_db.SaveChanges();
。是否有一种更简单的方法来更新Customer
?因为Customer
有很多属性,最好不要手动匹配Customer
和vm.Customer
的所有参数。
我找到了以下资源:
- asp.net官方文档似乎过于复杂(请参见将课程分配添加到讲师编辑页面部分),并且需要显式编写所有
Customer
的参数。 - 这个流行的线程在SO上。第3种方法看起来就是我需要的,但我无法更新导航属性。