2012-02-15 71 views
1

当我将解释什么,我试图做真正的快速编辑实体的相关集合。编辑实体

我有一个页面,我可以修改客户端。一个客户端也有一个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在每次迭代,但我不知道在哪里用它去之后

+0

您是否使用了ORM?请发布您的SaveClient方法的代码。 – CrazyCoderz 2012-02-15 18:11:49

+0

你的编辑是我要推荐的修复。如果它是0,则只将它添加到client.ClientContacts集合中。这些帮助有用? – Matt 2012-02-15 18:13:20

+0

我打算让他在saveclient之前查找并清理重复项:) – CrazyCoderz 2012-02-15 18:17:13

回答

1

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

这里基本上是这个问题:

foreach (var clientContact in viewModel.ClientContacts) 
       client.ClientContacts.Add(new ClientContact 

,因为它总是增加了每clientcontact从视图模型到客户端的clientcontact集合。

如果客户接触已经在它最有可能有一个clientcontactid属性数据库存在,你可以检查,这将是大于0

foreach(ClientContact clientContact in viewModel.ClientContacts) 
{ 
    if (clientContact.ClientContactId ==0) 
     //add it to the collection here 
} 

是类似的东西是什么你在找什么?