C# 如何填充相关的查找字段CRM 2011

C# 如何填充相关的查找字段CRM 2011,c#,plugins,dynamics-crm-2011,lookup,entityreference,C#,Plugins,Dynamics Crm 2011,Lookup,Entityreference,我想创建一个审计插件,每当一个“联系人”实体被更改时,就会创建一个“历史联系人”实体,该实体包含更改前旧“联系人”实体的所有数据 我的问题是,如果我在“联系人”到“帐户”中有一个查找字段,我如何将此查找获取到特定的“帐户”,并将其放置在“历史联系人”实体的查找字段中 我完成了插件,但现在有一个新问题 “联系人”实体的“名字”字段可以为空 “历史联系人”实体的主要字段为“名字”,但不是必需的 如果在创建“历史联系人”实体时没有“名字”,则会抛出错误。我不知道这是为什么 我是否需要一个主字段来创建

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

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


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

“联系人”实体的“名字”字段可以为空

“历史联系人”实体的主要字段为“名字”,但不是必需的

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


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

我不确定我是否遵循。当某些内容发生更改时,您正在创建联系人的完整副本?要做到这一点,在更新消息的执行后使用一个预映像非常简单。预映像是更新前联系人的快照

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

您有两个选择:

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) 使用现成的审核功能。可能是也可能不是你正在寻找的,但你可以阅读更多关于这一点的信息