2017-11-17 17 views
0

に同じまたは異なるエンティティのレコードを作成し、更新します他の失敗したロールバックする必要があります。作成および更新</strong><em>OR</em><strong>更新をし、任意の共同関連の取引が取得する場合ように、単一のトランザクションで単一または複数のエンティティに</strong>レコードを削除し、私は<strong>したい単一ExecuteTransactionRequestまたはExecuteMultipleRequest

私はネット上で検索しようとしましたが、これに運がありませんでした。これを実現する方法はありますか?

答えて

0

はもう少し試行錯誤の後、私はこの問題を解決することができました。私がここで提供している解決策は、コードに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); 
1

私は以下のコードを書いて、トランザクションでCreateとUpdateが可能かどうかをテストしました。答えは「いいえ」と思われます。

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

ここで別のエンティティを更新できますか?例えば。 1回目のリクエストでアカウントレコードを作成し、2回目のリクエストで既存のコンタクトレコードを更新してtransReqで追加しようとするとどうなりますか?出来ますか?はいの場合は、それに応じてサンプルを更新できますか? –

0

混乱を避けるために、ここでアカウントを作成した後、コンタクトを更新する例を示します。私が知る限り、アカウントIDはトランザクション内の2番目のリクエストでは利用できません。

私の結論は次のとおりです。はい、同じトランザクションで作成したアカウントに関連付ける予定がない限り、連絡先を更新できます。関心の

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

関連する問題

 関連する問題