【问题标题】:Editing an entity's related collection when editing the entity编辑实体时编辑实体的相关集合
【发布时间】:2012-03-07 02:18:42
【问题描述】:

我会很快解释我想要做什么。

我有一个可以编辑客户的页面。 Client 也有一组 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

因此,客户端有 3 个,而不是数据库中有 2 个 ClientContact,与现有 ClientContact 重复

请注意,我无法先为客户端清除数据库中的所有 ClientContact,因为其他表中存在与每个 ClientContact 相关的一堆数据。

如何更改我的编辑方法来解决这个问题?

编辑:我还应该提到,对于现有的 ClientContacts,ClientContactID 被传递给 viewModel.ClientContacts,如果是新联系人,则 ClientContactID 为 0。我想我可以检查一下每次迭代时 ClientContactID 是否为 0,但我不确定在那之后该去哪里

【问题讨论】:

  • 你在使用 ORM 吗?请发布您的 SaveClient 方法的代码。
  • 您的编辑是我要推荐的修复方法。如果它是 0 ,则仅将其添加到 client.ClientContacts 集合中。这有帮助吗?
  • 我打算让他在 saveclient 之前查找并清理重复项 :)

标签: c# asp.net asp.net-mvc asp.net-mvc-3 entity-framework


【解决方案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
}

您正在寻找类似的东西吗?

【讨论】:

    猜你喜欢
    • 2012-04-26
    • 2018-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多