Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 编辑实体';在编辑实体时删除相关集合_C#_Asp.net_Asp.net Mvc_Asp.net Mvc 3_Entity Framework - Fatal编程技术网

C# 编辑实体';在编辑实体时删除相关集合

C# 编辑实体';在编辑实体时删除相关集合,c#,asp.net,asp.net-mvc,asp.net-mvc-3,entity-framework,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 3,Entity Framework,我会很快解释我想做什么 我有一个可以编辑客户的页面。客户机还有一组ClientContacts,通过数据库中的外键进行关联。编辑客户端时,您还可以添加/编辑同一页面上的所有ClientContacts 以下是我的视图模型: public class ClientViewModel { [ScaffoldColumn(false)] public int ClientId { get; set; } [DisplayName("Name")] public str

我会很快解释我想做什么

我有一个可以编辑客户的页面。客户机还有一组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; }
}
我的问题是:假设我正在编辑的这个客户端已经有一个ClientContact-
ID:1,Name:Client1
。如果我编辑此客户端,添加另一个ClientContact,然后保存我的客户端,它不会编辑现有ClientContact,而是将其与新ClientContact一起添加,因此我得到:

ID: 1, Name: Client1
ID: 2, Name: Client1
ID: 3, Name: Client2
因此,在数据库中没有2个ClientContacts,客户机有3个,与现有ClientContacts重复

请注意,我不能首先清除客户机数据库中的所有ClientContacts,因为其他表中有大量与每个ClientContact相关的数据

如何更改编辑方法以修复此问题


编辑:我还应该提到,对于现有的ClientContacts,ClientContactID被传递到
viewModel.ClientContacts
,如果是新联系人,ClientContactID为0。我想我可以在每次迭代中检查ClientContactID是否为0,但我不确定在那之后应该使用它到哪里,所以我希望我能正确理解这一点。您正在将所有客户端联系人添加到“编辑”的ClientContacts列表中,然后调用SaveClient(),因此上面的代码创建了重复问题

这就是问题的本质:

foreach (var clientContact in viewModel.ClientContacts)
                client.ClientContacts.Add(new ClientContact
因为它总是将viewmodel中的每个clientcontact添加到客户端的clientcontact集合中

如果数据库中已存在客户端联系人,则它很可能具有clientcontactid属性,您可以检查该属性,并且该属性将大于0

差不多

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

您正在寻找这样的东西吗?

您正在使用ORM吗?请发布您的SaveClient方法的代码。您的编辑是我要推荐的修复程序。仅当它为0时,才将其添加到client.ClientContacts集合。这有什么帮助吗?我本来打算让他在saveclient之前查找并清除副本:)
foreach(ClientContact clientContact in viewModel.ClientContacts)
{
  if (clientContact.ClientContactId ==0)
      //add it to the collection here
}