我正在尝试创建一个插件,如果在帐户表单中更改了父帐户的地址字段,则会更改所有相关联系人的地址字段。我创建了一个插件,可以在预操作阶段(针对帐户实体的更新消息)同步运行。
我使用LINQ查询来检索所有相关联系人并且它有效。然后我使用foreach循环来循环所有联系人并更改它们的地址字段。我正在使用OrganizationServiceContext.AddObject();函数将每个联系人添加到跟踪管道(或其任何名称),最后我使用OrganizationServiceContext.SaveChanges();试图保存所有联系人。但那是我收到这个错误的时候:
System.InvalidOperationException:上下文已经在跟踪“联系人”实体。
这是我的代码
// Updating child contacts' fields
if (context.PreEntityImages.Contains("preAccount") && context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity) {
if (((Entity)context.InputParameters["Target"]).Contains("address2_name")) {
Entity account = (Entity)context.InputParameters["Target"];
Entity preAccount = (Entity)context.PreEntityImages["preAccount"];
if (account["address2_name"] != preAccount["address2_name"]) {
EntityReference parentCustomer = new EntityReference(account.LogicalName, account.Id);
Contact[] childContacts = orgService.ContactSet.Where(id => id.ParentCustomerId == parentCustomer).ToArray();
foreach (Contact contact in childContacts) {
contact.Address2_Name = (string)account["address2_name"];
orgService.AddObject(contact);
}
orgService.SaveChanges();
}
}
}
我做错了什么?
答案 0 :(得分:1)
当您使用查询
检索联系人时,您已将实体附加到上下文Contact[] childContacts = orgService.ContactSet.Where(id => id.ParentCustomerId == parentCustomer).ToArray();
因此您无需再次将实体添加到上下文中,而是需要通过以下方式更新它们:
orgService.UpdateObject(contact); // this row instead of orgService.AddObject(contact);