在单个 ExecuteTransactionRequest 或 ExecuteMultipleRequest 中创建和更新相同或不同的实体记录
Create and update same or different entity record in single ExecuteTransactionRequest or ExecuteMultipleRequest
我想创建和更新 或 更新和删除 单个或多个记录单个事务中的实体,以便如果任何相关事务失败,则应回滚其他事务。
我曾尝试通过网络进行搜索,但没有成功。有什么办法可以实现吗?
我写了下面的代码来测试在事务中是否可以创建和更新。看起来答案是 "No"。
它失败了,因为 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
为避免混淆,下面是创建帐户后更新联系人的示例。据我所知,交易中的第二个请求中帐户 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
经过反复试验,我终于解决了这个问题。我在这里提供的解决方案可能不推荐给所有人,因为我在代码中创建了 GUID。因此,当我们在代码上创建 GUID 而不是在数据库端自动创建时,可能存在性能问题。但是,是的,这个解决方案对我有用。
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);
我想创建和更新 或 更新和删除 单个或多个记录单个事务中的实体,以便如果任何相关事务失败,则应回滚其他事务。
我曾尝试通过网络进行搜索,但没有成功。有什么办法可以实现吗?
我写了下面的代码来测试在事务中是否可以创建和更新。看起来答案是 "No"。
它失败了,因为 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
为避免混淆,下面是创建帐户后更新联系人的示例。据我所知,交易中的第二个请求中帐户 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
经过反复试验,我终于解决了这个问题。我在这里提供的解决方案可能不推荐给所有人,因为我在代码中创建了 GUID。因此,当我们在代码上创建 GUID 而不是在数据库端自动创建时,可能存在性能问题。但是,是的,这个解决方案对我有用。
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);