2011-12-05 122 views
4

我最近開始使用CRM 2011中的插件,並將創建消息中註冊的插件作爲後期操作面臨問題。CRM 2011中的Microsoft.Xrm.Sdk.SaveChangesException

當我將創建註冊爲後期操作時,我期望當我點擊插件代碼時,該實體已經在數據庫中創建,我應該能夠創建一個相關的實體(與新由外鍵創建的實體)插入到插件中。但是,當我創建相關的實體並更新它,並說SaveChanges(),它給了我一個Microsoft.Xrm.SaveChangesException「處理此請求時發生錯誤」

如果我深入到內部異常,它只是指向OrganizationServiceFault。堆棧跟蹤它顯示的是:

服務器堆棧跟蹤: 在System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime操作,ProxyRpc & RPC) 在System.ServiceModel.Channels.ServiceChannel.Call(串動,單向布爾值,ProxyOperationRuntime操作,Object [] ins,Object []出,TimeSpan超時) at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall,ProxyOperationRuntime operation) at System.ServiceModel.Channels.ServiceChannelProxy.Invoke IMessage消息)

異常重新拋出在[0]: 在System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(即時聊天reqMsg,即時聊天retMsg) 在System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData & MSGDATA,的Int32類型) 在微軟.Xrm.Sdk.IOrganizationService.Execute(OrganizationRequest request) at Microsoft.Xrm.Sdk.Client.OrganizationServiceProxy.ExecuteCore(OrganizationRequest request) at Microsoft.Xrm.Sdk.Client.OrganizationServiceContext.Execute(OrganizationRequest request) at Microsoft。 Xrm.Sdk.Client.OrganizationServiceContext.SaveChange(OrganizationRequest request,IList`1 results

I僅在創建消息時才面對此問題,如果我對更新或刪除執行相同的操作,則可以正常工作。有沒有人遇到過這個問題?請提供一些我可以嘗試解決此問題的意見。提前致謝!

另外,這裏是我的插件代碼。

當創建ct_repcode實體時,插件被觸發,然後在我的插件中創建一個ct_repcodeMember實體,該實體具有鏈接到實際ct_repcode實體的ct_repcodeid字段。

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 
+0

請問您能展示一些代碼嗎?你如何關聯記錄? – ccellar

+0

@ckeller:我用代碼片段更新了我的原始問題。 – user1081934

+0

另外,稍微偏離主題,但是您是否嘗試設置遠程調試會話以查看這些變量的值在運行時的值? –

回答

2

我以前也遇到過這個問題。我認爲問題在於,在CRM 2011中,當您仍在數據庫事務中時,事前和事後操作都會發生。

我們解決這個問題的方法是將插件翻轉爲異步運行,因爲不需要同步結果。

我不確定在目前的代碼結構中是否有其他解決方法。我還沒有嘗試過這一點,但考慮到你可以創建實體就好,你可以創建repcodeMember實體與查找填充?是否真的需要創建,檢索和更新?如果你有一些運行在創建相關實體上的代碼,你可以通過這個插件來共享這些代碼,這樣你就可以直接創建它,因爲它是給你帶來問題的更新。

0

我想你已經做了什麼:通過上下文創建,查找和更新實體並不是一個好方法。你可以創建一個實體,我的意思是對象更新,然後通過服務創建它。我已經把代碼放在下面。

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); 
1

你也可以嘗試設置ct_repcodeid實體參考的邏輯名稱,它看起來像你只設置Id。

1

感謝@rocksolid和@patricgh,我只是把他們的建議,結合起來,並圍繞它做了一個代碼示例。

您應該放棄使用此操作的Service Context並使用CRM的默認CRUD功能。您的EntityReference不正確,因爲您必須擁有邏輯名稱,但由於您已有Entity,因此您應該使用EntityReference來設置該值。

Entity repcodeEntity = _context.InputParameters["Target"] as Entity;     

Ct_repcodemember repcodeMember = new Ct_repcodemember();  

repcodeMember.ct_repcodeid = repcodeEntity.ToEntityReference(); 

_service.Create(repcodeMember);