我想创建一个审核插件,每当更改“联系人”实体时,会创建一个“历史联系人”实体,该实体在更改之前拥有旧“联系人”实体的所有数据。
我的问题是,如果我在“帐户”的“联系人”中有一个查找字段,我该如何查找特定的“帐户”并将其放在“历史联系人”实体的查询字段中?< / p>
我完成了插件,但现在出现了一个新问题。
“联系人”实体的“名字”字段中可以有一个空白。
“历史联系”实体将“名字”作为其主要字段,但不是必需的。
如果在创建“历史联系人”实体时没有“名字”,则会抛出错误。我不知道为什么会这样。
即使字段标记为“无约束”,我是否还需要主字段来创建实体?
答案 0 :(得分:0)
我不确定我会效仿。当某些内容发生变化时,您是否正在创建联系人的完整副本?使用“更新后执行”消息上的“预映像”可以非常简单地执行此操作。预映像是更新前联系人的快照。
但为什么不使用提供的审核功能?
答案 1 :(得分: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);
}
如果你不熟悉插件,那里有很多教程,你可以从我在this question中提出的推荐开始