使用ExecuteTransactionRequest创建相关实体
本文关键字:实体 创建 ExecuteTransactionRequest 使用 | 更新日期: 2023-09-27 18:26:43
我有父子关系中的实体类型。
由于ExecuteTransactionRequest
在一个事务中执行多个消息请求,下面的操作会按我的意愿进行吗?
有3个父母没有孩子可以开始:
//Create a 4th parent
cs_parent parent4 = new cs_parent{ cs_name = "p4" };
CreateRequest createParentRequest = new CreateRequest { Target = parent4 };
request.Requests.Add(createParentRequest);
EntityCollection parents
= context.RetrieveMultiple(/*fetchExpression to get all parents (I'm expecting 4 now)*/);
//Create a child for each parent
foreach (var p in parents.Entities)
{
cs_child child = new cs_child
{
cs_parentid = p.ToEntityReference();
}
CreateRequest createChildRequest = new CreateRequest { Target = child };
request.Requests.Add(createChildRequest);
}
response = (ExecuteTransactionResponse)context.Execute(request);
那时我会让4个父母各有一个孩子,还是只有3个,因为当我检索多个孩子时,第四个还没有创建(?)?
如果没有,如何在最后仍有一个Execute
命令的情况下理想地修改代码?
我实际上还没有100%确定地运行您的代码,但它看起来会出错,因为在您将第四个父记录分配为子实体上的EntityReference
时,它没有必要的信息。不过,你可以很容易地解决这个问题。CRM允许在一个批次Create
请求中提交所有相互依赖的记录的这种情况。通常,当您在CRM中创建记录时,系统会为其分配一个唯一标识符(guid),但您可以通过自己分配guid来覆盖此标识符,然后您就可以在其他对象上将其设置为EntityReference
。因此,当你创建第四个父级时,你会有这样的东西:
cs_parent parent4 = new cs_parent { cs_name = "p4",cs_parentId = Guid.NewGuid());
只是猜测实体上的Id字段,但你明白了。
从您的代码示例中,有一点我不确定context
是什么,所以我不能确定对其进行检索是否会返回parent4
对象。您可能需要有两个循环,一个循环用于现有的cs_parent
记录,为其创建子记录,另一个循环为request.Requests
列表中尚未在系统中的父记录创建子记录。。。值得思考。
编辑:我意识到我误读了部分问题,但以下内容仍然适用于您要创建的新父记录。将其添加到ExecuteTransactionRequest
请求中。
将子项添加到父实体的RelatedEntitys集合(伪示例):
// Create parent object
var invoice = new Entity("invoice");
// Create list of child objects
var invoiceDetailList = new List<Entity>() { new Entity("invoicedetail"), new Entity("invoicedetail") };
// Add child records to parent record's RelatedEntities
invoice.RelatedEntities.Add(new Relationship("invoice_invoicedetails"), new EntityCollection(invoiceDetailList));
// Add to ExecuteTransactionRequest.
transactionRequest.Requests.Add(new CreateRequest { Target = invoice });
这样,您就不需要事先知道父记录的GUID。