我有一个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()
调用Execute()
失败的情况下多次调用ExecuteMultipleRequest
?
修改
我正在使用Dynamics CRM Online(8.2.1.344)。以下是插件跟踪日志的视图,显示其用作商机ID的值以及已创建商机的ID。单个年份跟踪消息只是内存中的对象创建。
答案 0 :(得分:3)
基于this post,ExecuteMultiple在插件内运行时获取自己的数据库事务。如果这些交易没有嵌套,我想这就是为什么你会得到这个错误,因为创造的opp将在他自己的交易中,但尚未提交。
作为旁注,在ExecuteMultiple中运行创建是否有任何好处?它旨在减少多个请求的身份验证时间;在一个插件中,使用它真的没有任何好处。
答案 1 :(得分:0)
除了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);
}