2017-08-31 76 views
1

我有一個Dynamics CRM插件,可在創建父機會時創建多個子記錄。該插件註冊爲post-operation,同步運行。ExecuteMultiple與創建的不同行爲

當我獨立創建的每個子記錄,一切工作正常:

Entity entity = (Entity)context.InputParameters["Target"]; 

do 
{ 
    var revenue = new Entity("new_opportunityrevenue"); 
    revenue["lor_opportunityid"] = new EntityReference("opportunity", entity.Id); 

    // Create the child record - Works 
    service.Create(revenue); 

    currentYear++; 
} while (currentYear <= lastYear); 

但是,如果我切換到ExecuteMultipleRequest,我得到一個錯誤,每當它試圖創建記錄Opportunity ID不存在。這發生在第一個請求上,所以不會發生額外的處理。

Entity entity = (Entity)context.InputParameters["Target"]; 

var revenueRecords = new List<Entity>(); 

do 
{ 
    var revenue = new Entity("new_opportunityrevenue"); 
    revenue["lor_opportunityid"] = new EntityReference("opportunity", entity.Id); 

    revenueRecords.Add(revenue); 

    currentYear++; 
} while (currentYear <= lastYear); 

// Create the request object 
var request = new ExecuteMultipleRequest() 
{ 
    Settings = new ExecuteMultipleSettings() 
    { 
     ContinueOnError = false, 
     ReturnResponses = true 
    }, 
    Requests = new OrganizationRequestCollection() 
}; 

// Add a CreateRequest for each entity to the request collection 
foreach(var entity in revenueRecords) 
{ 
    var createRequest = new CreateRequest { Target = entity }; 
    request.Requests.Add(createRequest); 
} 

// Execute all the requests in the collection using a single method call - Fails 
// Opportunity With Id = 4ea41651-538e-e711-8118-e0071b6ad141 Does Not Exist 
var response = (ExecuteMultipleResponse)service.Execute(request); 

爲什麼會調用Create()多次工作,同時用ExecuteMultipleRequest失敗調用Execute()

編輯

我使用Dynamics CRM Online中(8.2.1.344)。以下是插件跟蹤日誌的視圖,顯示其用作商機ID的值以及創建機會的ID。個別年跟蹤消息只是內存中的對象創建。

Matching Ids

+0

CRM的哪個版本(8.0,8.1,...)?另外,請嘗試使用'context.PrimaryEntityId'而不是通過Target來查看是否有任何更改。 – Alex

+0

我們正在使用CRM Online(8.2)。我會嘗試你的建議,看看是否有任何改變。 –

+0

@Alex使用'context.PrimaryEntityId'和'entity.Id'沒有什麼區別。 –

回答

3

基於this post,插件內運行時的ExecuteMultiple都有自己的數據庫事務。如果這些事務沒有嵌套,我想這就是爲什麼你會得到這個錯誤,因爲opp的創建將在它自己的事務中沒有被提交。

作爲一個方面說明,是否有任何好處,你想在ExecuteMultiple內運行你的創建?它旨在更多地減少來自多個請求的認證時間;在一個插件中,使用它真的沒有獲得的性能。

+0

+1之下的評論,因爲我同意在插件中使用ExecuteMultiple毫無價值(並且基於我執行的一些測試,它可能比創建記錄更慢分別)。此消息只能從外部使用。 –

+0

@Matt感謝您分享這篇文章!說實話,在引入插件和其他一些變化之後,機會創造性能開始減弱。我使用ExecuteMultiple的目的只是爲了看看它是否會有所幫助,完全期望任何性能提升都很小。當你不確定它是什麼時...發現它不是什麼! –

0

除了馬特的優秀答案之外,您應該嘗試在代碼&中更改此變量名稱,看看錯誤消失了。

Entity **entity** = (Entity)context.InputParameters["Target"]; 

......... 

// Add a CreateRequest for each child entity to the request collection 
foreach(var **childentity** in revenueRecords) 
{ 
var createRequest = new CreateRequest { Target = **childentity** }; 
request.Requests.Add(createRequest); 
}