2016-05-04 109 views
2

前Dynamics CRM中自定義工作流,我努力讓自己在Dynamics CRM中的自定義工作流。當另一個實體被刪除時,我需要刪除一些實體。實體刪除

創建我class library和我取回被刪除的實體的Guid與此代碼:

protected override void Execute(CodeActivityContext executionContext) 
    { 
     ITracingService tracingService = executionContext.GetExtension<ITracingService>(); 

     IWorkflowContext context = executionContext.GetExtension<IWorkflowContext>(); 
     IOrganizationServiceFactory serviceFactory = 
      executionContext.GetExtension<IOrganizationServiceFactory>(); 
     IOrganizationService service = 
      serviceFactory.CreateOrganizationService(context.UserId); 

     mService = service; 
     mExecutionContext = executionContext; 

     Guid myTipologyTypeDeleted = context.PrimaryEntityId; 
     bool isReading = context.PrimaryEntityName.Equals(new_tipologialettura_richiesta.EntityLogicalName); 
     bool isMaintenance = context.PrimaryEntityName.Equals(new_tipologiamanutenzionerichiesta.EntityLogicalName); 

     bool myResult = AddOnIntervention(isReading, isMaintenance, myTipologyTypeDeleted); 


     // Retrieve the summands and perform addition 
     result.Set(executionContext, myResult); 
    } 

而這裏所有的作品中,我得到了Guid和我得到的type(讀或維護)。

我的問題是,當我嘗試檢索與此代碼的實體(相同的代碼在另一個工作流工作順利啓動紀錄的創造,但在記載中刪除給我的錯誤)。

  Entity myReadingEntity = mService.Retrieve(new_tipologialettura_richiesta.EntityLogicalName, myTipologyTypeDeleted, new ColumnSet(true)); 

在這裏,我得到一個異常說找不到ID myIdMyType的記錄已被發現。

我檢查的記錄,它仍然在數據庫中存在,因此它並沒有被刪除。我做錯了什麼?

感謝

+0

1)如果你想刪除子記錄您是否考慮將關係屬性更改爲自動刪除記錄爲你準備好嗎? 2)檢索失敗的調用...你試圖檢索當前正在刪除的記錄嗎?你需要檢索它,以便你可以檢查它的值? 3)你說你檢查數據庫的記錄,它仍然存在,你什麼時候做檢查?如果您在工作流程完成運行但工作流程失敗後進行檢查,那麼平臺可能已經回滾了刪除操作。 – Polshgiant

+0

@Polshgiant感謝您的回覆!我在這裏回覆:1)它不是小孩,只與另一個工作流程的操作有關。 2)我有兩個的EntityRef在這個實體是指兩個實體,我需要在我的業務,​​我怎麼可以檢索整個記錄不失敗? 3)或許是肯定的,這是一個回滾如你所說 –

+0

我預計該平臺將讓您檢索,因此目前被刪除的記錄,但如果沒有,那麼你可以讓你自定義的WF組件接受多個輸入參數,然後在WF設計您可以從正在刪除的記錄中傳入值。那有意義嗎? – Polshgiant

回答

1

我想在這裏寫您的定製邏輯的最好的事情將是一個Plugin,你應該寫上

Message: Delete 
Stage: POST 

運行在Post Delete Operation註冊插件後一個插件,你應該添加一個pre-image這將可在發出檢索Post Delete with all the attributes。相反,最好的做法是將圖像推入所需的數據來代替。

從MSDN摘自: Registering for pre or post images to access entity attribute values results in improved plug-in performance as compared to obtaining entity attributes in plug-in code through RetrieveRequest or RetrieveMultipleRequest requests.

在你的插件改變的代碼行:

Entity myReadingEntity = mService.Retrieve(new_tipologialettura_richiesta.EntityLogicalName, myTipologyTypeDeleted, new ColumnSet(true)); 

if (context.PreEntityImages.Contains("YourImageName")) 
{ 
    Entity myReadingEntity = context.PreEntityImages["YourImageName"] 
}