1

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

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

我做错了什么?

4

1 回答 1

1

当您使用查询检索联系人时,您已经将实体附加到上下文

Contact[] childContacts = orgService.ContactSet.Where(id => id.ParentCustomerId == parentCustomer).ToArray();

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

orgService.UpdateObject(contact); // this row instead of orgService.AddObject(contact);
于 2013-09-08T12:27:05.330 回答