Я объясню, что я пытаюсь сделать очень быстро.
У меня есть страница, где я могу редактировать клиентов.Клиент также имеет коллекцию 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.
Как я могу изменить свой метод Edit, чтобы исправить это?
EDIT: Я должен также упомянуть, что ClientContactID передается вviewModel.ClientContacts
для существующих ClientContacts, и ClientContactID равен 0, если это новый контакт.Я предполагаю, что могу сделать проверку, чтобы видеть, равен ли ClientContactID 0 на каждой итерации, но я не уверен, куда идти с этим после этого