编辑实体时编辑实体的相关集合

时间:2012-02-15 17:47:57

标签: c# asp.net asp.net-mvc asp.net-mvc-3 entity-framework

我会解释我正在努力做的事情。

我有一个页面,我可以编辑客户端。客户端还有一组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,但我不知道在那之后该去哪里

1 个答案:

答案 0 :(得分:1)

好的,所以我希望我能正确理解这一点。您正在编辑中将所有客户端联系人添加到ClientContacts列表,然后调用SaveClient(),以便上面的代码创建重复的问题。

基本上是问题所在:

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
}

就像你在寻找什么?