OrganizationServiceContext:System.InvalidOperationException:上下文已经跟踪“联系人”实体

时间:2013-09-08 11:42:12

标签: dynamics-crm-2011 dynamics-crm

我正在尝试创建一个插件,如果在帐户表单中更改了父帐户的地址字段,则会更改所有相关联系人的地址字段。我创建了一个插件,可以在预操作阶段(针对帐户实体的更新消息)同步运行。

我使用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();
        }
    }
}

我做错了什么?

1 个答案:

答案 0 :(得分:1)

当您使用查询

检索联系人时,您已将实体附加到上下文
Contact[] childContacts = orgService.ContactSet.Where(id => id.ParentCustomerId == parentCustomer).ToArray();

因此您无需再次将实体添加到上下文中,而是需要通过以下方式更新它们:

orgService.UpdateObject(contact); // this row instead of orgService.AddObject(contact);