Microsoft Dynamics CRM - 电子邮件实体检索数据 - 插件
Microsoft Dynamics CRM - Email Entity Retrieve Data - Plug In
我正在尝试为 Microsoft Dynamics CRM Online 中的电子邮件实体编写一个插件。假设它叫做 "Sample_PlugIn".
我希望插件检索电子邮件的发件人,并将 his/her 电子邮件地址写入电子邮件的字段 (new_samplefield)。
插件还做一些其他的事情(而且一切正常),但这部分代码是造成问题的地方。 (我的组织服务参考名为 "service"。)
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);
}
每次执行插件时,我都会得到这个错误:
Unexpected exception from plug-in (Execute):
Sample_PlugIn.Sample_PlugIn:
System.Collections.Generic.KeyNotFoundException: The given key was not
present in the dictionary.
如果有人能帮助我就太好了 - 非常感谢!
为了解决这个问题,您需要了解 partylist 字段的工作原理以及 Activity Party entity 在这方面的作用。
基本上,"from" 字段(它也适用于电子邮件 activity 中的收件人、抄送和抄送字段)可以包含具有不同实体类型的多个实体引用。 Activity Party 实体是一个 "wrapper",它允许您将所有这些不同的实体类型作为一个实体来处理。您可以通过检查 fromCollection 对象轻松检查此内容:
如果您更进一步检查该实体的属性,您会发现这些属性不是您期望的属性,现在很明显错误是由于 internalemailaddress 属性在这个实体中不存在(事实上,这个属性只存在于 systemuser 实体中所以你的插件没有考虑到 account/contact/etc 也可以是发件人)。
在派对列表的属性中,您会发现两个有用的属性。 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"];
}
为了完整起见,这是最终对我有用的代码。在这种情况下,发件人是实体系统用户。 (我已经在 "post-operation" 和 "Update" 上注册了这个插件。)
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);
}
我正在尝试为 Microsoft Dynamics CRM Online 中的电子邮件实体编写一个插件。假设它叫做 "Sample_PlugIn".
我希望插件检索电子邮件的发件人,并将 his/her 电子邮件地址写入电子邮件的字段 (new_samplefield)。
插件还做一些其他的事情(而且一切正常),但这部分代码是造成问题的地方。 (我的组织服务参考名为 "service"。)
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);
}
每次执行插件时,我都会得到这个错误:
Unexpected exception from plug-in (Execute): Sample_PlugIn.Sample_PlugIn: System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary.
如果有人能帮助我就太好了 - 非常感谢!
为了解决这个问题,您需要了解 partylist 字段的工作原理以及 Activity Party entity 在这方面的作用。
基本上,"from" 字段(它也适用于电子邮件 activity 中的收件人、抄送和抄送字段)可以包含具有不同实体类型的多个实体引用。 Activity Party 实体是一个 "wrapper",它允许您将所有这些不同的实体类型作为一个实体来处理。您可以通过检查 fromCollection 对象轻松检查此内容:
如果您更进一步检查该实体的属性,您会发现这些属性不是您期望的属性,现在很明显错误是由于 internalemailaddress 属性在这个实体中不存在(事实上,这个属性只存在于 systemuser 实体中所以你的插件没有考虑到 account/contact/etc 也可以是发件人)。
在派对列表的属性中,您会发现两个有用的属性。 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"];
}
为了完整起见,这是最终对我有用的代码。在这种情况下,发件人是实体系统用户。 (我已经在 "post-operation" 和 "Update" 上注册了这个插件。)
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);
}