C# 编辑实体';在编辑实体时删除相关集合
我会很快解释我想做什么 我有一个可以编辑客户的页面。客户机还有一组ClientContacts,通过数据库中的外键进行关联。编辑客户端时,您还可以添加/编辑同一页面上的所有ClientContacts 以下是我的视图模型: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
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
}