私は実際に何をしようとしているのかを説明します。エンティティを編集するときにエンティティの関連するコレクションを編集する
私はクライアントを編集できるページがあります。クライアントには、データベース内の外部キーを介して関連するClientContactsのコレクションもあります。クライアントを編集するときに、同じページにすべてのClientContactsを追加/編集することもできます。
ここにあります私の見解モデル:
[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
}
私の問題はこれです:
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; }
}
そして、私のコントローラメソッドは、クライアントを編集するには、私は編集がすでにClientContactを持っているだと言うこのクライアント - ID: 1, Name: Client1
。私は、このクライアントを編集し、別のClientContactを追加し、私のクライアントを保存した場合、それは既存のClientContactを編集しません、それは新しいClientContactと一緒にそれを追加しますので、私は得る:
ID: 1, Name: Client1
ID: 2, Name: Client1
ID: 3, Name: Client2
だからではなく、2 ClientContactsを有しているとデータベースには、既存のClientContactの複製を持つクライアントが3つあります。
クライアントのデータベース内のすべてのClientContactsをクリアすることはできません。他のテーブルには多数のデータが存在します。各ClientContactに関連しています。
これを修正するにはどうすれば私の編集方法を変更できますか?
EDIT:私もClientContactIDが既存のClientContactsためviewModel.ClientContacts
に渡されることを言及する必要があり、それは新しい連絡先の場合ClientContactIDは0です。 ClientContactIDが各繰り返しで0であるかどうかを調べることができると思いますが、それ以降どこに行くのかわかりません。
ORMを使用していますか? SaveClientメソッドのコードを投稿してください。 – CrazyCoderz
あなたの編集は私が推薦しようとしていた修正です。 0の場合は、client.ClientContactsコレクションにのみ追加します。それはまったく助けになりますか? – Matt
私は彼にsaveclientの前に重複を探してきれいにするつもりでした:) – CrazyCoderz