0

我想创建一个审计插件,每当更改“联系人”实体时,都会创建一个“历史联系人”实体,其中包含更改前旧“联系人”实体的所有数据。

我的问题是,如果我在“联系人”到“客户”中有一个查找字段,我如何获得对特定“客户”的查找并将其放在“历史联系人”实体的查找字段中?


我完成了插件,但现在有一个新问题。

“联系人”实体在“名字”字段中可以有一个空白。

“历史联系人”实体将“名字”作为其主要字段,尽管它不是必需的。

如果在创建“历史联系人”实体时没有“名字”,则会引发错误。我不知道这是为什么。

即使该字段被标记为“无约束”,我是否需要一个主字段来创建实体?

4

2 回答 2

0

我不确定我是否跟随。当事情发生变化时,您正在创建联系人的完整副本?要做到这一点非常简单,只需在 Post Execute of Update 消息上添加 Pre Image。Pre Image 是更新前联系人的快照。

但是你为什么不使用提供的审计功能呢?

于 2013-05-16T08:36:42.560 回答
0

你有两个选择:

1)按照以下方式创建一个插件:

public void Execute(IServiceProvider serviceProvider)
{
    var context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
    var service = ((IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory))).CreateOrganizationService(context.UserId);

    var originalContact = context.InputParameters["Target"] as Entity;
    var newContact = new Entity("new_historicalcontact");
    if (originalContact.Contains("firstname"))
    {
        newContact.Add("new_firstname", orginalContact["firstname"]);
    }
    if (originalContact.Contains("emailaddress1"))
    {
        newContact.Add("new_emailaddress1", orginalContact["emailaddress1"]);
    }
    if (originalContact.Contains("parentcustomerid"))
    {
        newContact.Add("new_parentcustomerid", orginalContact["parentcustomerid"]);
    }

    //etc etc for other properties
    service.Create(newContact);
}

如果你不熟悉插件,有很多教程,你可以从我在这个问题中给出的建议开始

2) 使用开箱即用的审计功能。可能是也可能不是您要寻找的东西,但您可以在此处此处阅读有关此内容的更多信息

于 2013-05-16T13:15:49.640 回答