繁体   English   中英

ExecuteMultiple与Create的不同行为

[英]Different Behavior for ExecuteMultiple vs. Create

我有一个Dynamics CRM插件,可以在创建父机会时创建多个子记录。 该插件注册为post-operation ,同步运行。

当我独立创建每个子记录时,一切正常:

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。 单个年份跟踪消息只是内存中的对象创建。

匹配的ID

根据这篇文章 ,ExecuteMultiple在插件内运行时获得自己的数据库事务。 如果这些交易没有嵌套,我想这就是为什么你会得到这个错误,因为创造的opp将在他自己的交易中,但尚未提交。

作为旁注,在ExecuteMultiple中运行创建是否有任何好处? 它旨在减少多个请求的身份验证时间; 在一个插件中,使用它真的没有任何好处。

除了Matt的优秀答案之外,您应该尝试在代码中更改此变量名称并查看错误是否消失。

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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM