Plugins CRM 2011插件赢得';t更新并从ActivityParty获取电子邮件

Plugins CRM 2011插件赢得';t更新并从ActivityParty获取电子邮件,plugins,dynamics-crm-2011,crm,Plugins,Dynamics Crm 2011,Crm,我正在尝试从列表中的电子邮件中获取所有电子邮件(收件人、发件人、抄送),并查看列表并检查联系人,如果CRM中存在联系人,则电子邮件实体上的一个字段将标记为true。当我检查电子邮件的“收件人”、“发件人”和“抄送”字段时,它返回0个参与方,但没有错误。最后,当我调用service.Update(entity)时,它返回一个错误发生意外错误。 public void Execute(IServiceProvider服务提供者) { IPluginExecutionContext上下文=(IPlug

我正在尝试从列表中的电子邮件中获取所有电子邮件(收件人、发件人、抄送),并查看列表并检查联系人,如果CRM中存在联系人,则电子邮件实体上的一个字段将标记为true。当我检查电子邮件的“收件人”、“发件人”和“抄送”字段时,它返回0个参与方,但没有错误。最后,当我调用service.Update(entity)时,它返回一个错误<代码>发生意外错误。

public void Execute(IServiceProvider服务提供者)
{
IPluginExecutionContext上下文=(IPluginExecutionContext)服务提供程序
.GetService(类型为(IPluginExecutionContext));
IOOrganizationServiceFactory工厂=(IOOrganizationServiceFactory)服务提供商
.GetService(类型为(IOrganizationServiceFactory));
IOR组织服务=工厂
.CreateOrganizationService(context.UserId);
尝试
{
电子邮件实体;
if(context.MessageName==“创建”)
{
if(context.PostEntityImages.Contains(“PostImage”)
&&context.PostEntityImages[“PostImages”]是实体)
实体=(电子邮件)上下文。PostEntityImages[“PostImages”]。ToEntity();
其他的
抛出新异常(“无PostEntityImages…”);
}
其他的
抛出新异常(“EmailPortalVisibilityPlugin插件无效”);
if(entity.LogicalName!=“电子邮件”)
抛出新异常(“EmailPortalVisibilityPlugin无效”);
bool contactExists=false;
列表电子邮件=新列表();
emails.AddRange(ParseAddressUsed(entity.To,trace));
emails.AddRange(ParseAddressUsed(entity.From,trace));
emails.AddRange(ParseAddressUsed(entity.Cc,trace));
foreach(电子邮件中的字符串em)
{
contactExists=查找联系人(em、服务、跟踪);
如果(存在联系人)
打破
}
UpdateToggleEstate(实体、联系人、服务、跟踪);
}
捕获(例外情况除外)
{
抛出新的InvalidPlugineExecutionException(“执行“+”例如消息“+””);
}
}
使用的公共列表解析地址(
IEnumerable实体,ITracingService跟踪)
{
尝试
{
List addressStrings=新列表();
foreach(实体中的活动方)
address strings.Add(party.PartyId.Id.ToString());
返回地址字符串;
}
捕获(FaultException例外服务调用)
{
抛出新异常(“ParseAddressUsed FaultException”);
}
捕获(例外情况除外)
{
抛出新异常(“ParseAddressUsed异常”);
}
}
公共布尔查找联系人(
字符串(电子邮件地址、IOrganizationService服务、ITracingService跟踪)
{
尝试
{
QueryByAttribute QueryByAttribute=新的QueryByAttribute(“联系人”);
queryByAttribute.ColumnSet=新列集(“联系人ID”);
添加(“emailaddress1”);
queryByAttribute.Values.Add(电子邮件地址);
EntityCollection retrieved=service.RetrieveMultiple(queryByAttribute);
返回(retrieved.Entities.Count>0);
}
捕获(FaultException例外服务调用)
{
抛出新异常(“LookupContact异常”);
}
捕获(例外情况除外)
{
抛出新异常(“LookupContact异常”);
}
}
公共无效更新不动产(
电子邮件实体、bool切换状态、IOrganizationService服务、ITracingService跟踪)
{
尝试
{
实体电子邮件=新实体(“电子邮件”);
email.Id=entity.Id;
email.Attributes.Add(“new_clientfacing”,toggleState);
服务更新(电子邮件);
}
捕获(FaultException例外服务调用)
{
抛出新异常(“UpdateToggleEstate异常”);
}
捕获(例外情况除外)
{
抛出新异常(“UpdateToggleEstate异常”);
}
}

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


对于函数
UpdateToggleState
中的最终更新,当您已经拥有实体变量时,不需要创建新的电子邮件实体(
实体电子邮件=新实体(“电子邮件”);
)。您只需设置
new\u clientfacing
属性并更新已检索的实体。

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

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


干杯,迪马穆拉

对不起,我是CRM 2011插件新手。我将第一个参数更改为
EntityCollection
,现在ParseAddressUsed函数出现错误。如何将entity.From转换为EntityCollection?我还尝试使用最初声明的变量更新updateToggleEstate函数中的实体变量。但这仍然给了我同样的错误。当我这样做时,你需要像这样调用ParseAddressUsed函数
ParseAddressUsed((EntityCollection)entity.From,trace)
,我收到一个intellisense错误,它说:
无法将“System.Collection.Generic.IEnumerable”转换为“Microsoft.Xrm.Sdk.EntityCollection”
我注意到您在插件代码中同时使用了早期绑定和晚期绑定。你可以考虑使用其中的一个。代码>(EntityCollection)实体。From可与早期绑定类型一起使用。