在单个ExecuteTransactionRequest或ExecuteMultipleRequest中创建和更新相同或不同的实体记录

时间:2017-11-17 13:50:24

标签: transactions dynamics-crm microsoft-dynamics

我希望在单个交易中对单个或多个实体进行创建和更新 更新和删除记录,以便在任何相关的情况下事务失败,其他应该回滚。

我试图通过网络搜索,但没有运气。我们有可能实现这个目标吗?

3 个答案:

答案 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

https://nishantrana.me/2016/07/

https://msdn.microsoft.com/en-us/library/gg328075.aspx

答案 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);