CRM 2011更新插件:哪些字段已更改?

时间:2013-03-26 10:17:33

标签: dynamics-crm-2011

如何在同步插件中确定哪些字段已更改?
插件在更新时注册 类似于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
} 

2 个答案:

答案 0 :(得分:13)

目标中实际存在的属性是已更改的属性。不存在未更改的属性。

答案 1 :(得分:11)

我将略微扩展GCATNM的答案。目标包含将要更新的所有值,不一定包含所有已更改的值。

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

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

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