我希望在单个交易中对单个或多个实体进行创建和更新 或 更新和删除记录,以便在任何相关的情况下事务失败,其他应该回滚。
我试图通过网络搜索,但没有运气。我们有可能实现这个目标吗?
答案 0 :(得分:1)
我编写了以下代码来测试事务中是否可以创建和更新。似乎答案是“不”。
它失败,因为UpdateRequest无权访问先前在事务中创建的帐户的ID。更新和删除似乎应该是可能的。
在您正在处理的创建和更新方案中,是否可以在创建记录之前应用更新的逻辑?
var transReq = new ExecuteTransactionRequest()
{
// Create an empty organization request collection.
Requests = new OrganizationRequestCollection(),
ReturnResponses = true
};
var account = new Account()
{
Name = "Acme, Inc."
};
var createReq = new CreateRequest
{
Target = account
};
transReq.Requests.Add(createReq);
account.NumberOfEmployees = 100;
var updateReq = new UpdateRequest
{
Target = account
};
transReq.Requests.Add(updateReq);
var response = (ExecuteTransactionResponse)svc.Execute(transReq);
请查看这篇文章: https://msdn.microsoft.com/en-us/library/mt634414.aspx
答案 1 :(得分:1)
为避免混淆,以下是创建帐户后更新联系人的示例。据我所知,仍然存在这样的限制,即账户ID在交易中的第二个请求中不可用。
我的结论是:是的,您可以更新联系人,只要您不希望将其与您在同一交易中创建的帐户相关联。
var transReq = new ExecuteTransactionRequest()
{
// Create an empty organization request collection.
Requests = new OrganizationRequestCollection(),
ReturnResponses = true
};
var account = new Account()
{
Name = "Acme, Inc.",
EntityState = EntityState.Created
};
var createReq = new CreateRequest
{
Target = account
};
transReq.Requests.Add(createReq);
var contact = getContacts().First(); //Get a contact however you want
contact.JobTitle = "President";
contact.EntityState = EntityState.Changed;
var updateReq = new UpdateRequest
{
Target = contact
};
transReq.Requests.Add(updateReq);
var response = (ExecuteTransactionResponse)svc.Execute(transReq);
其他感兴趣的文章:
http://www.kingswaysoft.com/blog/2015/04/19/New-CRM-SDK-Feature---Transactional-Batching
答案 2 :(得分:1)
经过一些试验和错误后,我能够解决这个问题。我在这里提供的解决方案可能不会被推荐给所有人,因为我在代码中创建了 GUID 。因此,我们在代码上创建 GUID 而不是在DB端自动创建时可能会出现性能问题。但是,这个解决方案对我有用。
OrganizationRequest req1 = new OrganizationRequest();
req1.RequestName = "Create";
Guid newAccountId = Guid.NewGuid();
var account = new Account()
{
Name = "Acme, Inc.",
Id = newAccountId
};
req1.Parameters.Add("Target", account);
// Create second account
OrganizationRequest req2 = new OrganizationRequest();
account.Name = "Updated name of Acme, Inc.";
req2.RequestName = "Update";
req2.Parameters.Add("Target", account);
// Using Execute Multiple
ExecuteTransactionRequest multipleRequest = new ExecuteTransactionRequest();
multipleRequest.Requests = new OrganizationRequestCollection();
multipleRequest.Requests.Add(req1);
multipleRequest.Requests.Add(req2);
var responseForRecords = (ExecuteTransactionResponse)_serviceProxy.Execute(multipleRequest);