如何在同步插件中确定哪些字段已更改?
插件在更新时注册
类似于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
}
答案 0 :(得分:13)
目标中实际存在的属性是已更改的属性。不存在未更改的属性。
答案 1 :(得分:11)
我将略微扩展GCATNM的答案。目标包含将要更新的所有值,不一定包含所有已更改的值。
除非您在表单上执行一些非常“hacky”的javascript,否则从CRM Web前端更新/创建的目标实体将始终只包含已更改的值,因为CRM UI中的javascript只会发送已更改的值。
但是,如果您通过其他方法更新数据(odata调用,使用SDK进行C#更新)并且更新请求中包含的值尚未实际更改,则它们将显示在插件的目标中。例如,如果您有一个C#进程来抓取特定实体的所有属性,那么更新单个属性,该实体的所有属性都将显示在目标中。
所以真正的目标不是改变了什么,而是插件完成后实体将会是什么。您需要在预映像中包含要检查更改的属性,以便能够确定值是否确实已更改。