使用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命令的情况下理想地修改代码?

使用ExecuteTransactionRequest创建相关实体

我实际上还没有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。