2017-11-17 12 views
0

내가 만들고또는업데이트를 업데이트하고 있다는 어떤 공동 관련된 트랜잭션이 얻는 경우에, 그래서 하나의 트랜잭션에서 하나 또는 여러 개의 개체에 기록을 삭제 원하는 만들기 및 업데이트 실패한 다른 롤백해야합니다.는 동일하거나 서로 다른 개체 하나 ExecuteTransactionRequest에서 레코드 또는 ExecuteMultipleRequest

나는 인터넷을 통해 검색하려했지만이 문제가 발생하지 않았습니다. 우리가 이것을 성취 할 수있는 방법이 있습니까?

답변

0

는 좀 더 시행 착오 후에 나는이 문제를 해결할 수 있었다. 여기에 제공하는 솔루션은 코드에 GUID을 작성한대로 모두에게 권장하지 않을 수 있습니다. 따라서 DB 측면에서 자동 생성 대신 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); 
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

+0

예, 나는 우리가 여부를 첫 번째 장소에서 그것을 할 수 있다면 그 지침이 필요한 이유 그래서 그건 동일한 참조를 시도하고 또한 주위에 재생하려고하지만 난 할 수 없습니다했다. –

+0

여기에서 다른 엔티티를 업데이트 할 수 있습니까? 예를 들어. 첫 번째 요청에서 계정 레코드를 만들고 두 번째 요청에서 기존 연락처 레코드를 업데이트하고 transReq에 추가하려고하면 어떻게 될까요? 가능한가? 그렇다면 샘플에 맞게 업데이트 할 수 있습니까? –

0

혼란을 방지하기를, 여기에 계정을 만든 후 연락처를 업데이트 할 수있는 예입니다. 내가 알 수있는 한, 거래 내에서 두 번째 요청에서 계정 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