CRM 2011插件不会更新并从ActivityParty获取电子邮件

时间:2013-02-23 06:09:27

标签: plugins dynamics-crm-2011 crm

我正在尝试从列表中的电子邮件中获取所有电子邮件(来往,来自,cc)并查看列表并检查联系人,如果CRM中存在联系人,则会标记电子邮件实体上的字段是的。当我检查电子邮件的to,from和cc字段时,它返回0方,但那里没有错误。最后,当我调用service.Update(entity)时,它会返回一个错误。 An unexpected error occurred.

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

  try
  {
  Email entity;
  if (context.MessageName == "Create")
  {
    if (context.PostEntityImages.Contains("PostImage") 
      && context.PostEntityImages["PostImage"] is Entity)
      entity = (Email)context.PostEntityImages["PostImage"].ToEntity<Email>();
    else
      throw new Exception("No PostEntityImages...");
  }
  else
    throw new Exception("EmailPortalVisibilityPlugin Plugin invalid");

  if(entity.LogicalName != "email")
    throw new Exception("EmailPortalVisibilityPlugin invalid");

  bool contactExists = false;
  List<string> emails = new List<string>();
  emails.AddRange(ParseAddressUsed(entity.To, trace));
  emails.AddRange(ParseAddressUsed(entity.From, trace));
  emails.AddRange(ParseAddressUsed(entity.Cc, trace));
  foreach (String em in emails)
  {
    contactExists = LookupContact(em, service, trace);
    if (contactExists)
      break;
  }
  UpdateToggleState(entity, contactExists, service, trace);
  }
  catch (Exception ex)
  {
    throw new InvalidPluginExecutionException("Execute '" + ex.Message + "'");
  }
}

public List<string> ParseAddressUsed(
  IEnumerable<ActivityParty> entity, ITracingService trace)
{
  try
  {
    List<string> addressStrings = new List<string>();
    foreach (ActivityParty party in entity)
      addressStrings.Add(party.PartyId.Id.ToString());
    return addressStrings;
  }
  catch (FaultException<OrganizationServiceFault> exceptionServiceCall)
  {
    throw new Exception("ParseAddressUsed FaultException");
  }
  catch (Exception ex)
  {
    throw new Exception("ParseAddressUsed Exception");
  }
}

public bool LookupContact(
  String emailAddress, IOrganizationService service, ITracingService trace)
{
  try
  {
    QueryByAttribute queryByAttribute = new QueryByAttribute("contact");
    queryByAttribute.ColumnSet = new ColumnSet("contactId");
    queryByAttribute.Attributes.Add("emailaddress1");
    queryByAttribute.Values.Add(emailAddress);
    EntityCollection retrieved = service.RetrieveMultiple(queryByAttribute);

    return (retrieved.Entities.Count > 0);
  }
  catch (FaultException<OrganizationServiceFault> exceptionServiceCall)
  {
    throw new Exception("LookupContact Exception");
  }
  catch (Exception ex)
  {
    throw new Exception("LookupContact Exception");
  }
}

public void UpdateToggleState(
  Email entity, bool toggleState, IOrganizationService service, ITracingService trace)
{
  try
  {
    Entity email = new Entity("email");
    email.Id = entity.Id;
    email.Attributes.Add("new_clientfacing", toggleState);
    service.Update(email);
  }
  catch (FaultException<OrganizationServiceFault> exceptionServiceCall)
  {
    throw new Exception("UpdateToggleState Exception");
  }
  catch (Exception ex)
  {
    throw new Exception("UpdateToggleState Exception");
  }
}

2 个答案:

答案 0 :(得分:0)

尝试将函数 ParseAddressUsed 的第一个参数类型设置为EntityCollection而不是IEnumerable<ActivityParty>,并进行必要的更改。

对于功能 UpdateToggleState 的最终更新,当您已拥有实体变量时,无需创建新的电子邮件实体(Entity email = new Entity("email");)。您只需设置new_clientfacing属性并更新已检索的实体。

答案 1 :(得分:0)

在方法ParseAddressUsed中,您将PartyId GUID添加到字符串列表中,并在emailaddress1过滤器中的LookupContact中将其用作参数,这可能就是您没有检索任何内容的原因记录。

请尝试将addressStrings.Add(party.PartyId.Id.ToString())更改为addressStrings.Add(party.AddressUsed),然后查看是否有效。

干杯,dimamura