当我将解释什么,我试图做真正的快速编辑实体的相关集合。编辑实体
我有一个页面,我可以修改客户端。一个客户端也有一个ClientContacts集合,通过数据库中的一个外键进行关联。编辑客户端时,您还可以在同一页面上添加/编辑所有客户端联系人。
这里是我的视图模型:
public class ClientViewModel
{
[ScaffoldColumn(false)]
public int ClientId { get; set; }
[DisplayName("Name")]
public string Name { get; set; }
[DisplayName("Contacts")]
public List<ClientContactViewModel> ClientContacts { get; set; }
}
public class ClientContactViewModel
{
[ScaffoldColumn(false)]
public int ClientContactId { get; set; }
[DisplayName("Client")]
public int ClientId { get; set; }
[Required(ErrorMessage = "Name is required")]
[StringLength(100, ErrorMessage = "Name must be 100 characters or less")]
[DisplayName("Name")]
public string Name { get; set; }
}
而我控制的方法来修改客户:
[HttpPost]
public ActionResult Edit(ClientViewModel viewModel)
{
// get client
Client client = _clientsRepository.GetClient(viewModel.ClientId);
client.Name = viewModel.Name;
if (ModelState.IsValid)
{
// save client contacts
if (viewModel.ClientContacts != null)
foreach (var clientContact in viewModel.ClientContacts)
client.ClientContacts.Add(new ClientContact
{
ClientID = client.ClientID,
Name = clientContact.Name
});
_clientsRepository.SaveClient(client);
return RedirectToAction("Index");
}
return View(viewModel); // validation error, so redisplay same view
}
我的问题是这样的:说这个客户是我的编辑已经有一个ClientContact - ID: 1, Name: Client1
。如果我修改该客户,添加其他ClientContact然后保存我的客户端,它不修改现有ClientContact,它增加了它与新ClientContact一起,所以我得到:
ID: 1, Name: Client1
ID: 2, Name: Client1
ID: 3, Name: Client2
所以不是有2个ClientContacts在数据库中,客户端有3个,现有ClientContact的副本为
请注意,我无法首先清除数据库中的所有客户端联系人,因为其他表中存在大量数据与每个ClientContact相关。
我怎样才能改变我的编辑方法来解决这一问题?
编辑:我还要提到的是,ClientContactID传递给viewModel.ClientContacts
现有ClientContacts和ClientContactID是0,如果它是一个新的联系人。我想我可以做一个检查,看看是否ClientContactID是0在每次迭代,但我不知道在哪里用它去之后
您是否使用了ORM?请发布您的SaveClient方法的代码。 – CrazyCoderz 2012-02-15 18:11:49
你的编辑是我要推荐的修复。如果它是0,则只将它添加到client.ClientContacts集合中。这些帮助有用? – Matt 2012-02-15 18:13:20
我打算让他在saveclient之前查找并清理重复项:) – CrazyCoderz 2012-02-15 18:17:13