我会解释我正在努力做的事情。
我有一个页面,我可以编辑客户端。客户端还有一组ClientContacts,它们通过数据库中的外键相关联。编辑客户端时,您还可以在同一页面上添加/编辑所有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重复
请注意,我无法首先清除客户端数据库中的所有ClientContacts,因为其他表中有大量数据与每个ClientContact相关。
如何更改我的编辑方法以解决此问题?
编辑:我还应该提到ClientContactID传递给viewModel.ClientContacts
现有的ClientContacts,如果ClientContactID是新联系人,则ClientContactID为0。我想我可以检查每次迭代时ClientContactID是否为0,但我不知道在那之后该去哪里
答案 0 :(得分:1)
基本上是问题所在:
foreach (var clientContact in viewModel.ClientContacts)
client.ClientContacts.Add(new ClientContact
因为它始终将viewmodel中的每个clientcontact添加到客户端的clientcontact集合中。
如果客户端联系人已存在于数据库中,则很可能有一个clientcontactid属性,您可以检查该属性,它将大于0。
类似
foreach(ClientContact clientContact in viewModel.ClientContacts)
{
if (clientContact.ClientContactId ==0)
//add it to the collection here
}
就像你在寻找什么?