Dynamics crm 2011 CRM 2011中的Microsoft.Xrm.Sdk.SaveChangesException
我最近开始在CRM 2011中使用插件,我在创建消息上注册插件作为Post操作时遇到问题 当我注册创建为post操作时,我希望当我点击插件代码时,实体已经在数据库中创建,我应该能够在插件中创建相关实体(通过外键与新创建的实体相关)。但是,当我创建并更新相关实体,并说SaveChanges()时,它会给我一个Microsoft.Xrm.SaveChangesException“处理此请求时出错” 如果我深入到内部异常,它只会指向OrganizationServiceFault。它显示的堆栈跟踪是: 服务器堆栈跟踪: 位于System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime操作,ProxyRpc&rpc) 在System.ServiceModel.Channels.ServiceChannel.Call(字符串操作、布尔单向、ProxyOperationRuntime操作、对象[]输入、对象[]输出、时间跨度超时) 位于System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage方法调用,ProxyOperationRuntime操作) 位于System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage消息) 在[0]处重试异常: at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg,IMessage retMsg) at System.Runtime.Remoting.proxy.RealProxy.PrivateInvoke(MessageData&msgData,Int32类型) 在Microsoft.Xrm.Sdk.IOrganizationService.Execute(OrganizationRequest)中 位于Microsoft.Xrm.Sdk.Client.OrganizationServiceProxy.ExecuteCore(OrganizationRequest请求) 在Microsoft.Xrm.Sdk.Client.OrganizationServiceContext.Execute(OrganizationRequest请求) 在Microsoft.Xrm.Sdk.Client.OrganizationServiceContext.SaveChange(OrganizationRequest请求,IList`1结果 我只在创建邮件时遇到此问题,如果我对更新或删除执行相同的操作,效果很好。有人遇到过此问题吗?请提供有关我可以尝试解决此问题的方法的一些信息。提前感谢 另外,这是我的插件代码 创建ct_repcode实体时会触发插件,然后在我的插件中创建一个ct_repcodeMember实体,该实体具有一个链接到实际ct_repcode实体的ct_repcodeid字段Dynamics crm 2011 CRM 2011中的Microsoft.Xrm.Sdk.SaveChangesException,dynamics-crm-2011,crm,Dynamics Crm 2011,Crm,我最近开始在CRM 2011中使用插件,我在创建消息上注册插件作为Post操作时遇到问题 当我注册创建为post操作时,我希望当我点击插件代码时,实体已经在数据库中创建,我应该能够在插件中创建相关实体(通过外键与新创建的实体相关)。但是,当我创建并更新相关实体,并说SaveChanges()时,它会给我一个Microsoft.Xrm.SaveChangesException“处理此请求时出错” 如果我深入到内部异常,它只会指向OrganizationServiceFault。它显示的堆栈跟踪是:
Entity repcodeEntity = _context.InputParameters["Target"] as Entity;
Guid repcodeId = repcodeEntity.Id;
//Create a new Ct_repcodemember object
Ct_repcodemember repcodeMember = new Ct_repcodemember();
Guid repCodeMemberId = _service.Create(repcodeMember);
repcodeMember = _serviceContext.Ct_repcodememberSet.Where(a => a.Id == repCodeMemberId).FirstOrDefault();
repcodeMember.ct_repcodeid = new EntityReference { Id = repcodeId };
//Update the object and save the changes in crm
_serviceContext.UpdateObject(repcodeMember);
_serviceContext.SaveChanges(); // --- The timeout error happens here
我以前也遇到过这个问题。我认为问题在于,在CRM 2011中,当您仍在数据库事务中时,会发生预操作和后操作 我们解决这个问题的方法是翻转插件以异步运行,因为同步结果是不必要的
我不确定您当前的代码结构是否有其他方法可以解决此问题。我也没有尝试过,但考虑到您可以创建实体,是否可以创建填充查找的repcodeMember实体?是否真的需要创建、检索然后更新?如果您有一些在create上运行的代码对于相关实体,您可以与此插件共享,这样您就可以直接创建,因为更新会给您带来问题。我认为您所做的:通过上下文创建、查找和更新实体不是一个好方法。您可以创建一个实体,我指的是对象更新,然后创建它通过服务。我已经把代码如下
Entity repcodeEntity = _context.InputParameters["Target"] as Entity;
Guid repcodeId = repcodeEntity.Id;
Ct_repcodemember repcodeMember = new Ct_repcodemember();
repcodeMember.ct_repcodeid = new EntityReference { Id = repcodeId };
_service.Create(repcodeMember);
您还可以尝试设置ct_repcodeid实体引用的逻辑名称,看起来您只是在设置Id。请相信@rocksolid和@patricgh,我只是采纳了他们的建议,将它们结合起来,并在其周围添加了一个代码示例。 您应该停止使用此操作的
服务上下文
,并使用CRM的默认CRUD功能。您的EntityReference
不正确,因为您必须有一个逻辑名称,但由于您已经有一个实体
,您应该只使用EntityReference
来设置该值
Entity repcodeEntity = _context.InputParameters["Target"] as Entity;
Ct_repcodemember repcodeMember = new Ct_repcodemember();
repcodeMember.ct_repcodeid = repcodeEntity.ToEntityReference();
_service.Create(repcodeMember);
你能展示一些代码吗?你如何关联这些记录?@ckeller:我已经用一段代码片段更新了我的原始问题。另外,有点离题,但你是否尝试设置远程调试会话,以查看这些变量在运行时的值是什么?@PeterMajeed-是的。我已经设置了远程调试,我看到repcodeMember对象和Id被创建并返回,但当我说SaveChanges时,它超时了。有人知道我在这段代码中可能出了什么问题吗?