C# ExecuteMultiple与Create的不同行为

C# ExecuteMultiple与Create的不同行为,c#,dynamics-crm,microsoft-dynamics,C#,Dynamics Crm,Microsoft Dynamics,我有一个Dynamics CRM插件,它在创建父opportunity时创建多个子记录。插件注册为一个同步运行的后期操作 当我独立创建每个子记录时,一切正常: Entity entity = (Entity)context.InputParameters["Target"]; do { var revenue = new Entity("new_opportunityrevenue"); revenue["lor_opportunityid"] = new EntityRefe

我有一个Dynamics CRM插件,它在创建父opportunity时创建多个子记录。插件注册为一个同步运行的
后期操作

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

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);
为什么多次调用
Create()
有效,而使用
ExecuteMultipleRequest调用
Execute()
失败

编辑

我正在使用Dynamics CRM Online(8.2.1.344)。这里是插件跟踪日志的视图,显示了它用作Opportunity ID的值,以及已创建的Opportunity的ID。个别年份跟踪消息仅在内存对象创建中

基于,ExecuteMultiple在插件内部运行时会获得自己的数据库事务。如果这些事务不是嵌套的,我想这就是为什么会出现这个错误,因为opp创建将在它自己的尚未提交的事务中


另外,在ExecuteMultiple中运行creates有什么好处吗?它的设计更多的是为了减少来自多个请求的身份验证时间;在一个插件中,使用它真的无法获得性能

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

它是CRM的哪个版本(8.0、8.1等)?另外,尝试使用
context.PrimaryEntityId
而不是通过Target查看是否有任何变化。我们正在使用CRM Online(8.2)。我将尝试你的建议,看看这是否有什么不同。@Alex使用
上下文。PrimaryEntityId
实体.Id
没有区别。如果异步运行它会发生什么?您在两个不同的位置使用相同的变量名“entity”。您没有收到任何错误吗?+1,因为我也同意在插件中使用ExecuteMultiple是毫无价值的(并且根据我执行的一些测试,它甚至比单独创建记录还要慢)。此消息只能从外部使用。@Matt感谢分享此帖子!老实说,opportunity create的性能在引入该插件以及其他一些更改后开始下降。我使用ExecuteMultiple的目标只是看看它是否有任何帮助,完全希望任何性能提升都是最小的。当你不确定它是什么的时候。。。找出它不是什么!
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);
}