CRM 2011组织服务更新()插件内部失败

时间:2015-01-15 01:54:22

标签: dynamics-crm-2011 crm

我在我的帐户插件中获得了这段代码,之前一直在运行,但现在仍然遇到这个有线问题。

尝试做的是,在更新帐户时,还要更新主要联系人。

ColumnSet contactCols = new ColumnSet(new string[] { "firstname"});
Entity contact = orgService.Retrieve("contact", contactId, contactCols);
tracer.Trace("firstname is " + contact["firstname"]);

contact["firstname"] = DateTime.Now.ToString();
orgService.Update(contact);  

Retrieve()有效,但Update()将抛出以下异常:

Unhandled Exception: 
Microsoft.Xrm.Sdk.InvalidPluginExecutionException: 
System.ServiceModel.FaultException`1[Microsoft.Xrm.Sdk.OrganizationServiceFault]: 
System.ServiceModel.FaultException`1[Microsoft.Xrm.Sdk.OrganizationServiceFault]: 
System.NullReferenceException: 
Microsoft Dynamics CRM has experienced an error. Reference number for administrators or support: #BF42D86C (Fault Detail is equal to Microsoft.Xrm.Sdk.OrganizationServiceFault). (Fault Detail is equal to Microsoft.Xrm.Sdk.OrganizationServiceFault).
  at CRMSyncPlugin.SyncEntityClass.Execute(IServiceProvider serviceProvider)
  at Microsoft.Crm.Asynchronous.V5ProxyPlugin.Execute(IServiceProvider serviceProvider)
  at Microsoft.Crm.Asynchronous.EventOperation.InvokePlugin(AsyncExecutionContext context, IPlugin pluginInstance)

它说NullReferenceException,我只是无法弄清楚什么是null。

=============================================== ===========

在尝试了@Nicknow建议之后,仍然出现同样的错误。 这是我从追踪中得到的:

Retrieving Contact: 048f9564-81b4-e311-a27c-0026553e0f7c
Retrieved Contact
firstname is John

检索工作,只是更新失败。 THX

3 个答案:

答案 0 :(得分:1)

我添加了一些额外的跟踪和空检查,这应该有效:

tracer.trace("Retrieving Contact: {0}", contactId.ToString());
ColumnSet contactCols = new ColumnSet(new string[] { "firstname"});
Entity contact = orgService.Retrieve("contact", contactId, contactCols);
tracer.trace("Retrieved Contact");

tracer.Trace("firstname is " + contact.Attributes.Contains("firstname") ? contact["firstname"] : "(No Value for firstname)");

if (contact.Attributes.Contains("firstname")) contact["firstname"] = DateTime.Now.ToString();
else contact.Attributes.Add("firstname", DateTime.Now.ToString());
orgService.Update(contact);  

答案 1 :(得分:0)

您可能会检查是否有另一个插件在联系人更新上运行 - 错误可能来自其他插件而不是此插件。

答案 2 :(得分:0)

我通常不会尝试更新从Retrieve调用中获取的对象。只需新建一个联系人,设置ID,并仅包含您要更改的字段。

ColumnSet contactCols = new ColumnSet(new string[] { "firstname"});
Entity contact = orgService.Retrieve("contact", contactId, contactCols);
tracer.Trace("firstname is " + contact["firstname"]);
var updateContact = new Contact();
updateContact["contactId"] = contactId;
updateContact["firstname"] = DateTime.Now.ToString();
orgService.Update(updateContact); 

我发现这往往会避免这些问题。