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

Bvr*_*rce 6 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
} 
Run Code Online (Sandbox Code Playgroud)

Tea*_*Dev 13

Target中实际存在的属性是已更改的属性.不存在未更改的属性.

  • 使用前映像或后映像(http://msdn.microsoft.com/en-us/library/gg309673.aspx#bkmk_preandpost) (8认同)

Dar*_*ryl 11

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

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

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

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