Dynamics CRM中的操作(action)是否是一个事务(transaction)?
生活随笔
收集整理的這篇文章主要介紹了
Dynamics CRM中的操作(action)是否是一个事务(transaction)?
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
關注本人微信和易信公眾號: 微軟動態CRM專家羅勇 ,回復168或者20151104可方便獲取本文,同時可以在第一時間得到我發布的最新的博文信息,follow me! 以前的博文?微軟Dynamics CRM 2013介紹系列之二十三:操作(Action)的開發與配置?簡單介紹了Dynamics CRM 2013起新增一種新的流程類型--操作,英文是action,沒有做實驗證實,操作中所有的步驟是否是同一個事務?是否存在可選的選項?如果不是的話,Microsoft Dynamics CRM Online 2015 Update 1 的更新中包括了一個新的消息叫做 ExecuteTransactionRequest 用來在同一個事務中執行多個消息應該是個補充,我因為沒有CRM Online 2015 Update 1環境,而Dynamics CRM 2015本地部署的版本又一直沒有出Update 1功能包,所以暫時無法演示給這個消息給大家看。相信待到今年出來Dynamics CRM 2016出來后是可以演示的。 在解決方案中,我們建立一個簡單的流程,如下:我這里選擇的實體是 無(全局) ,這樣執行起來方便點。 ? 我先增加兩個簡單的字符串類型的參數如下: 我這里增加兩個簡單的類型為 創建記錄 的步驟,步驟一創建的客戶為本操作的參數AccountName1的值,步驟二創建的客戶為本操作的參數 AccoutName2 的值。 ? ?然后激活這個操作,這樣我們就可以調用這個操作了。 ? 我目前階段只能通過代碼來調用這個操作。因為在Dynamics CRM 2015中還不支持直接在工作流中調用操作,而到了Dynamics CRM 2015 Update 1則支持了。代碼如下: static void Main(string[] args)
{var service = GetOrganizationService();var whoAmIReq = new WhoAmIRequest();var whoAmIResp = service.Execute(whoAmIReq) as WhoAmIResponse;OrganizationRequest req = new OrganizationRequest("new_TestAction");req["AccountName1"] = "測試創建的客戶一";req["AccountName2"] = "測試創建的客戶二";req["Target"] = new EntityReference("systemuser", whoAmIResp.UserId);service.Execute(req);Console.WriteLine("程序運行完成!");Console.ReadKey();
}
正常的能成功,我就稍微修改下自定義工作流活動的代碼,故意把URL搞錯,然后測試,拋出了如下異常: 然后我們去看創建的客戶,發現沒有創建客戶。 ? ?如果我將操作的 啟用回滾 選項去掉,然后激活測試結果如下,可以看到客戶創建了,但是附件沒有創建。 ? 然后我還測試下,將這個創建附件的步驟放到第二步,且是為第一個創建的客戶添加附件: ? 當沒有選中 啟用回滾 選項的時候測試結果是:客戶一創建成功,第二個步驟出錯,沒有回滾整個操作,第三個步驟沒有執行。 如果我選中 啟用回滾 選項的話,測試結果是回滾了整個操作所做的事情。 ? 所以稍微總結下就是,操作如果選中了 啟用回滾 這個選項,操作的所有步驟都是一個事務,如果沒有選中,則是成功的會commit,失敗的當然失敗,后面的步驟不會執行。可以用來保證一次多個操作的事務性。 當我要刪除創建的測試工作流活動的時候,又碰到使用SDK的插件注冊工具(PluginRegistration)刪除自定義工作流活動的時候登陸以后出現空白的情況,按照帖子?CRM SDK 2015 Plugin registration tool not working?的說法,是語言包的問題,我得解決辦法就是把插件注冊工具文件夾中的除了 en, en-us 文件夾外所有的語言包都刪除掉: ? 當然還可以用Developer Toolkit來刪除,如下,自己再刪除源文件和 RegisterFile.crmregister 文件中的相應內容即可:
?
運行代碼后真的創建了兩個客戶如下: 為了測試我將這兩個新建的客戶刪除,然后我在創建客戶時間上注冊了一個實時工作流來讓創建客戶產生異常: ? ? 激活工作流以后,如果我手工創建客戶名稱包括 二 的客戶會報錯如下: 當然用代碼來執行也會報錯,我還是執行前面的代碼,代碼會跑出異常如下: ? 這個時候我去刷新下客戶界面看看第一個步驟增加的 測試創建的客戶一 是否增加,發現沒有增加。是我的代碼沒有處理異常嗎?我用異常處理塊將代碼包括起來還是同樣的錯誤。看來至少兩個CRM操作是在同一個事務中。 細心的朋友可能會發現,定義操作的時候有個選項默認是選中的,那就是啟用回滾選項,如下: ? 所以我在想,如果我去掉這個選中,也就是不選中 啟用回滾 ,會不會就不在同一事務中了?于是我這樣修改后激活去測試下: 然后我去執行前面相同的代碼,結果是創建了 測試創建的客戶一,沒有創建 測試創建的客戶二 ,看來是沒有回滾,也就是這個選項還是很重要的。 ? 我們繼續做一個小實驗,就是在前面兩個步驟以后加一個調用自定義工作流活動的步驟,這個自定義工作流活動我只是簡單的下載一個鏈接的文件作為第二個客戶的附件而已,代碼如下:稍微注意下,如果輸入類型是EntityReference,需要通過ReferenceTarget屬性指定是那個實體。?
public sealed class GetNoteContent : CodeActivity {[RequiredArgument][Input("要添加附件的客戶")][ReferenceTarget("account")]public InArgument<EntityReference> InAccount { get; set; }protected override void Execute(CodeActivityContext executionContext){IOrganizationServiceFactory serviceFactory = executionContext.GetExtension<IOrganizationServiceFactory>();IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);try{// TODO: Implement your custom Workflow business logic.using (WebClient client = new WebClient()){byte[] responseBytes = client.DownloadData(@"http://www.luoyong.me/GetAnnotationDocument.ashx?AnnotationId=B39F0691-C377-E511-80ED-000D3A800514");var annotationEntity = new Entity("annotation");annotationEntity["documentbody"] = Convert.ToBase64String(responseBytes);annotationEntity["subject"] = "微軟MVP羅勇用代碼增加的帶附件的注釋標題";annotationEntity["notetext"] = "微軟MVP羅勇用代碼增加的帶附件的注釋內容";annotationEntity["filename"] = "附件.pdf";annotationEntity["mimetype"] = "application/pdf";annotationEntity["isdocument"] = true;annotationEntity["objectid"] = InAccount.Get(executionContext);service.Create(annotationEntity);}}catch (FaultException<OrganizationServiceFault> e){tracingService.Trace("Exception: {0}", e.ToString());// Handle the exception.throw;}tracingService.Trace("Exiting GetNoteContent.Execute(), Correlation Id: {0}", context.CorrelationId);} }?
同時我還禁用然后刪除了之前創建的自定義工作流,這樣創建第二個客戶才能成功。修改了測試的操作,增加了一個調用自定義工作流活動的步驟如下: ? 我先測試 啟用回滾的情況,測試結果發現兩個客戶創建成功,且第二個客戶也增加了附件。正常的能成功,我就稍微修改下自定義工作流活動的代碼,故意把URL搞錯,然后測試,拋出了如下異常: 然后我們去看創建的客戶,發現沒有創建客戶。 ? ?如果我將操作的 啟用回滾 選項去掉,然后激活測試結果如下,可以看到客戶創建了,但是附件沒有創建。 ? 然后我還測試下,將這個創建附件的步驟放到第二步,且是為第一個創建的客戶添加附件: ? 當沒有選中 啟用回滾 選項的時候測試結果是:客戶一創建成功,第二個步驟出錯,沒有回滾整個操作,第三個步驟沒有執行。 如果我選中 啟用回滾 選項的話,測試結果是回滾了整個操作所做的事情。 ? 所以稍微總結下就是,操作如果選中了 啟用回滾 這個選項,操作的所有步驟都是一個事務,如果沒有選中,則是成功的會commit,失敗的當然失敗,后面的步驟不會執行。可以用來保證一次多個操作的事務性。 當我要刪除創建的測試工作流活動的時候,又碰到使用SDK的插件注冊工具(PluginRegistration)刪除自定義工作流活動的時候登陸以后出現空白的情況,按照帖子?CRM SDK 2015 Plugin registration tool not working?的說法,是語言包的問題,我得解決辦法就是把插件注冊工具文件夾中的除了 en, en-us 文件夾外所有的語言包都刪除掉: ? 當然還可以用Developer Toolkit來刪除,如下,自己再刪除源文件和 RegisterFile.crmregister 文件中的相應內容即可:
轉載于:https://www.cnblogs.com/luoyong0201/p/Dynamics_365_Is_Action_In_Transaction.html
總結
以上是生活随笔為你收集整理的Dynamics CRM中的操作(action)是否是一个事务(transaction)?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SpringBoot项目以服务器方式启动
- 下一篇: http、https比较