2015-05-13 53 views
1

我有一個插件需要創建一堆實體,並且這樣做使用;CRM插件在執行操作之前異常

service.Create(Entity); 

在插件的末尾(更新前同步),我有時需要取消保存操作。我知道如何拋出一個異常,但如果我這樣做,我的service.Create(Entity)不會被執行。

如何強制服務執行插件中的操作,然後通過拋出異常取消保存?

編輯:代碼是;

var id = service.Create(newEntity); 
throw new Exception("Cancelled Save but created the new entity"); 

如果我拋出異常,實體不會被創建。如果我不拋出異常,實體會創建。我需要它來創建並拋出異常,以便保存操作被取消。

感謝您的指點。

+0

您是否嘗試在更新實體之前執行驗證,如果驗證失敗,請使用'service.Create(Entity)'寫入錯誤表(新實體),並通知用戶更新操作失敗信息? –

+0

本質上,我創建了一個自定義實體,它記錄有關用戶嘗試更改的詳細信息,然後禁止保存。我在插件中這樣做,因爲可能有工作流和/或其他服務試圖修改記錄。 – creatiive

+1

如果'IPluginExecutionContext.IsInTransaction == true',那麼如果拋出異常,你所做的任何事情都將被回滾。順便說一句,不知道你的評論是什麼意思 - 但如果工作流更新記錄,插件仍然可以觸發。您可以嘗試在預驗證階段進行註冊,有時在交易之外進行註冊,但並非總是如此。在我看來,您實施的解決方案體系結構與Dynamics CRM平臺不一致。 – Nicknow

回答

2

Nicknow的答案是正確的,但仍然有幾種方法可以完成你想要做的事情。

  1. 在您的插件中,請勿使用插件上下文中的OrganizationService。就像創建控制檯應用程序一樣,創建自己的新OrganizationService。這個新的OrganizationService將不受原始OrganizationService的事務範圍的約束。

  2. 創建一個web服務來完成這項工作。從你的插件中,調用這個Web服務。 Web服務將不受原始OrganizationService的事務範圍的約束。

  3. 使用ExecuteMultiple。我從來沒有試過,但這裏的人誰聲稱它的工作原理:http://crmtidbits.blogspot.com/2014/02/bypass-plug-in-transaction-to-log.html

希望幫助!

+0

這取決於crm版本和彙總 – Sxntk

+0

@Sxntk你是說執行多重技巧只適用於某些CRM實例嗎? – Daryl

+0

@Daryl「... ExecuteMultipleRequest已添加到Microsoft Dynamics CRM 2011更新彙總12 ...」此處:https://msdn.microsoft.com/en-us/library/jj863631%28v=crm.5% 29.aspx – Sxntk

2

如果IPluginExecutionContext.IsInTransaction == true那麼當拋出異常時,任何寫入數據庫的東西都會回滾。您可以嘗試在預驗證階段進行註冊,有時在交易之外進行註冊,但並非總是如此。

請注意,不能保證它始終在交易之外。 SDK文檔使這一點非常明確 - 因此在任何時候都可能發生更新,將其置於交易中。

https://msdn.microsoft.com/en-us/library/gg327941.aspx#bkmk_DatabaseTransactions

插件可能會或可能不會在 的Microsoft Dynamics CRM平臺的數據庫事務中執行。插件是否爲 事務的一部分取決於消息請求如何通過管道處理 。您可以通過讀取由傳遞給插件的 IPluginExecutionContext繼承的IsInTransaction屬性來檢查插件是否正在事務 中執行。如果在數據庫事務中執行的插件是 ,並且允許例外 傳遞迴平臺,則整個事務將回滾到 。階段20和40保證是數據庫 交易的一部分,而階段10可能是交易的一部分。

在數據庫事務 期間執行的任何註冊插件並將異常傳回平臺將取消操作的核心 操作。這導致了核心操作的回滾。此外, 此外,任何事件前或事件後註冊的插件,如果 尚未執行,以及由插件註冊的相同事件 觸發的任何工作流將不會執行。

+0

所以要清楚,我不能保證我的插件在事務之外執行嗎?我的要求是使用service.Create(實體)執行操作,然後取消正在發生的保存操作。 – creatiive

+0

你在做什麼是最接近你可以得到,但你不能保證它。根據您的使用情況,這可能也可能不重要。如果您絕對必須保證它,您需要從插件向外部系統發出呼叫,並讓該外部系統將數據保存到CRM或其他數據存儲區。 – Nicknow

+0

「......預驗證階段,有時候在交易之外,但並非總是如此。」預先驗證在交易之外**總是**,除非預先或後期操作插件調用它。 – Sxntk

相關問題