2012-02-15 72 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 
} 

是類似的東西是什麼你在找什麼?