當我將解釋什麼,我試圖做真正的快速編輯實體的相關集合。編輯實體
我有一個頁面,我可以修改客戶端。一個客戶端也有一個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