7

如何在同步插件中确定哪些字段发生了变化?
插件在更新时注册。
类似 JavaScript 中的 isDirty() 的东西:

// TODO: Implement your custom Plug-in business logic.
IOrganizationService service = localContext.OrganizationService;
Entity account = (Entity)localContext.PluginExecutionContext.InputParameters["Target"];
if (account.GetAttributeValue<String>("address1_latitude").isDirty())
{
    service.Create(new Lead { FirstName = "LOCATION CHANGED" }); // this is a stub
} 
4

2 回答 2

15

Target 中实际存在的属性是已更改的属性。未更改的属性不会出现在那里。

于 2013-03-26T10:19:57.120 回答
13

我将稍微扩展 GCATNM 的答案。Target 包含更新请求中包含的所有值,而不仅仅是与数据库中当前存在的值不同的值。

除非您在表单上执行一些极其“hacky”的 JavaScript,否则从 CRM Web 前端更新/创建的目标实体将始终只包含已更改的值,因为 CRM UI 中的 JavaScript 只会发送已经改变。

但是,如果您通过其他方法(OData 调用、使用 SDK 的 C# 更新)更新数据,并且更新请求中包含的值实际上并未更改,它们将显示在插件的目标中。例如,如果您有一个 C# 进程获取特定实体的所有属性,然后更新单个属性,则该实体的所有属性都将显示在目标中。

所以真正的目标不是改变了什么,而是插件完成后实体将是什么。您需要在原图像中包含要检查更改的属性,以便能够确定值是否确实已更改。

于 2013-03-26T12:19:03.007 回答