![](/img/trans.png)
[英]Microsoft Dynamics CRM - Plug-in C# - add record to entity collection
[英]Microsoft Dynamics CRM - Email Entity Retrieve Data - Plug In
我正在尝试为Microsoft Dynamics CRM Online中的电子邮件实体编写插件。 假设其名为“ Sample_PlugIn”。
我希望插件检索电子邮件的发件人,并将他/她的电子邮件地址写入电子邮件的字段(new_samplefield)。
该插件还可以完成其他工作(并且都可以正常工作),但是这部分代码是造成问题的一个部分。 (我的组织服务参考称为“服务”。)
try
{
Entity email = (Entity)context.InputParameters["Target"];
EntityCollection fromCollection = (EntityCollection)email.Attributes["from"];
if (fromCollection != null && fromCollection.Entities.Count > 0)
{
Entity sender = fromCollection[0];
email["new_samplefield"] = (string)sender.Attributes["internalemailaddress"];
}
service.Update(email);
}
每次执行插件时,都会出现此错误:
插件发生意外异常(执行):Sample_PlugIn.Sample_PlugIn:System.Collections.Generic.KeyNotFoundException:字典中不存在给定的键。
如果有人可以帮助我,那就太好了-非常感谢!
为了解决该问题,您将需要了解partylist字段的工作方式以及Activity Party实体在此上的作用。
基本上,“发件人”字段(也适用于电子邮件活动中的“收件人”,“抄送”和“ cco”字段)可以保存具有不同实体类型的多个实体引用。 然后,活动方实体是一个“包装器”,它使您可以将所有这些不同的实体类型作为一个实体来处理。 您可以通过检查fromCollection对象轻松地检查此内容 :
如果您进一步检查该实体的属性,您会发现该属性不是您所期望的,现在很明显会产生错误,因为在该实体中不存在internalemailaddress属性(实际上,此属性仅存在于systemuser实体中,因此您的插件没有考虑到帐户/联系人/等也可以是发件人)。
在参与方列表的属性中,您会发现两个有用的属性。 partyid是对所引用记录(systemuser / contact / account / etc。 )的实际EntityReference,因此您可以使用它来检索记录并获取必填字段。 如果仅需要电子邮件地址 ,则可以使用addressused属性,如以下示例所示:
Entity email = (Entity)context.InputParameters["Target"];
EntityCollection fromCollection = (EntityCollection)email.Attributes["from"];
if (fromCollection != null && fromCollection.Entities.Count > 0)
{
Entity sender = fromCollection[0];
string emailAddress = (string)sender.Attributes["addressused"];
}
为了完整起见,这是最终为我工作的代码。 在这种情况下,发送者是实体systemuser。 (我已经在“后期操作”和“更新”上注册了此插件。)
try
{
Entity email = (Entity)context.InputParameters["Target"];
// Post Entity Image (since the plug-in is registered on "Update")
Entity postImage = context.PostEntityImages["Image"];
EntityCollection fromCollection = postImage.GetAttributeValue<EntityCollection>("from");
if (fromCollection != null && fromCollection.Entities.Count > 0)
{
Entity sender = fromCollection[0];
EntityReference partyId = sender.GetAttributeValue<EntityReference>("partyid");
string entityType = partyId.LogicalName.ToString();
if (entityType == "systemuser")
{
// Create query using querybyattribute
QueryByAttribute queryToSender = new QueryByAttribute("systemuser");
queryToSender.ColumnSet = new ColumnSet("systemuserid", "internalemailaddress");
// Attribute to query
queryToSender.Attributes.AddRange("systemuserid");
// Value of queried attribute to return
queryToSender.Values.AddRange(partyId.Id);
EntityCollection retrievedFromSystemuser = service.RetrieveMultiple(queryToSender);
foreach (Entity systemuserE in retrievedFromSystemuser.Entities)
{
email["new_samplefield"] = (string)systemuserE.Attributes["internalemailaddress"];
}
}
}
service.Update(email);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.