2017-04-04 56 views
2

我有大量的,我需要添加到我的CRM数据库中的记录。XRM SDK ExecuteMultipleRequest交易通过滚动

我使用下面的代码:由于大量记录的

var emRequest = new ExecuteMultipleRequest { 
    Requests = entityCreateRequests, 
    Settings = new ExecuteMultipleSettings 
    { 
     ContinueOnError = true, 
     ReturnResponses = true 
    } 
}; 
var createResponse = (ExecuteMultipleResponse)serviceProxy.Execute(emRequest); 

,我要的entityCreateRequests总数分成的500批次的现在我知道,如果这些中的一个500批次失败,整批失败,这对我有好处。 但是,我想为我的所有记录做一笔交易,即使我必须一个接一个地完成。类似于实体框架中的交易,如下所示:

serviceProxy.begin(); 
for (i =0 ; i<totalTrans; i++) { 
    try { 
     var createResponse = (ExecuteMultipleResponse)serviceProxy.Execute(emRequest); 
    } 
    catch(e) { 
     serviceProxy.rollback(); 
     break; 
    } 
    serviceProxy.commit(); 
} 

任何反馈,非常感谢。

回答

1

如果我理解你正确地你基本上要到几个ExecuteMultipleRequests一起链接到一个请求。我不认为你的想法是可能的。

但是,您可以更新MaxBatchSize,在这里看到:How to change the default ExecuteMultipleRequest batch size limit in CRM 2011 on premise?

或者在创建只有你可以存储结果,并通过在失败以后的请求删除它们手动恢复建立。

var idList = new List<Guid>(); 
var emRequest = new ExecuteMultipleRequest 
{ 
    Requests = new OrganizationRequestCollection(), 
    Settings = new ExecuteMultipleSettings 
    { 
     ContinueOnError = false, 
     ReturnResponses = true 
    }, 
}; 

var executeMultipleResponse = (ExecuteMultipleResponse)service.Execute(emRequest); 
if (!executeMultipleResponse.IsFaulted) 
{ 
    foreach (var response in executeMultipleResponse.Responses) 
    { 
     if (!response.Response.Results.Contains("id")) 
      continue; 

     var idValue = (string)response.Response.Results["id"]; 
    } 
} 
else 
{ 
    foreach (var id in idList) 
    { 
     service.Delete("entitylogicalname", id); 
    } 
} 
+0

是的,这正是我现在怎么处理它。我只是不喜欢它,因为我必须建立保障措施,我非常肯定有一种更优雅的方式。 – ChrisCaicedo

2

你可以(并且可能应该)使用未绑定行动处理造成的。例如,您可以使用一个具有EntityCollection作为输入参数的Action'CreateMultipleAccounts'。

在这次行动中,你需要的是在EntityCollection迭代,并创造记录的工作流程序集。您也可以在此工作流程组合中执行ExecuteMultipleRequest。

这样做的最大好处是Actions作为单个事务执行,这意味着如果创建/更新失败,整个过程将被回滚。

确保您检查启用回滚复选框ofcourse。

编辑:还有由艾琳Gusni一个博客帖子描述这个场景实际和她的测试结果,你可以找到在https://community.dynamics.com/crm/b/misscrm360exploration/archive/2015/07/05/utilizing-crm-custom-action-for-transaction-rollback-purposes

+0

这很有趣。我将不得不花费一些时间来学习如何使用它并对其进行测试。与此同时,我是否应该将您的答案标记为正确,如果这不能解决问题(或产生新问题),只需发布​​另一个问题? – ChrisCaicedo

+0

如果我的回答实际上回答/解决了您的问题,您应该只将您的问题标记为回答,我个人会暂时将其解决......但这只是我的看法。 – Nathan