2012-02-15 7 views
1

私は実際に何をしようとしているのかを説明します。エンティティを編集するときにエンティティの関連するコレクションを編集する

私はクライアントを編集できるページがあります。クライアントには、データベース内の外部キーを介して関連する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であるかどうかを調べることができると思いますが、それ以降どこに行くのかわかりません。

+0

ORMを使用していますか? SaveClientメソッドのコードを投稿してください。 – CrazyCoderz

+0

あなたの編集は私が推薦しようとしていた修正です。 0の場合は、client.ClientContactsコレクションにのみ追加します。それはまったく助けになりますか? – Matt

+0

私は彼にsaveclientの前に重複を探してきれいにするつもりでした:) – CrazyCoderz

答えて

1

大丈夫です。すべてのクライアントの連絡先を編集のClientContactsリストに追加してからSaveClient()を呼び出して、上のコードで重複した問題を作成しています。それは常に、クライアントのclientcontactコレクションへのviewmodelからすべてのclientcontactを追加するので

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

:ここ

は、本質的な問題です。

クライアントの連絡先はすでにそれが最も可能性の高いあなたがチェックすることができ、

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

のようなものは、その何のようなものである0

より大きくなりますclientcontactid性質を持っているDBに存在している場合あなたは探している?

関連する問題