【Dynamics CRM】【C#】【7.1新機能】UpsertRequest
Dynamics CRM 2015 Update1の新機能。続いてはもう一つの目玉機能と思っている、UpsertRequest。
SDK関係新機能の中ではとりわけわかりやすい追加機能の一つかと思います。
Requestに含めたEntityの代替キー指定で、レコードが既に存在していればUpdateを行い、存在していなければCreateを行うというもの。
まあ、名前そのまんま、というところですが。
UpsertRequest
一つ注意なのがUpsertは、CreateやUpdateと同じようにOrganizationServiceのメソッドとして提供されているものではありません。(自分がそう勘違いしてました……。)
SDK.Messagesに含まれているUpsertRequestをインスタンス化して、OrganizationService.Executeに渡してあげます。
■MSDN
Use Upsert to insert or update a record
またUpsertRequestを使う際には代替キーの指定が必須になります。
UpsertRequestのTargetに、更新または作成するEntityインスタンスを渡してあげますが、その際に代替キーを指定することで、そのレコードを作成するべきか、更新するべきかを判定します。
ですので、必ず実施する前に代替キーの作成を行っておいてください。
作成・更新どちらが行われたか確認するには、Executeのレスポンスで帰ってくる[UpsertResponse]のRecordCreatedパラメータで確認できます。
コード
というわけで、実際にやってみました。
せっかくなので、前の記事で作った代替キーをそのまま利用しています。
取引先担当者エンティティに同一のメールアドレスがあれば、Update、なければCreateをするものです。
・.NET Frameworks 4.5.2
using System; using Microsoft.Xrm.Client; using Microsoft.Xrm.Client.Services; using Microsoft.Xrm.Sdk; using Microsoft.Xrm.Sdk.Messages; namespace MyProject.UpsertRequestDatas { class Program { static void Main(string[] args) { var connection = CrmConnection.Parse("Url=https://****.crm7.dynamics.com; Username=****@****.onmicrosoft.com; Password=****;"); var service = new OrganizationService(connection); // Keyの設定 var keys = new KeyAttributeCollection(); /// Update用 keys.Add("emailaddress1", "someone_a@example.com"); /// Create用 /// keys.Add("emailaddress1", "someone_x@example.com"); // Update用Entityの作成 var Contact = new Entity("contact", keys); Contact["lastname"] = "UpsertRequest"; var upsertRequest = new UpsertRequest() { Target = Contact }; var response = (UpsertResponse)service.Execute(upsertRequest); if (response.RecordCreated) Console.WriteLine("レコードは作成されました"); else Console.WriteLine("レコードは更新されました"); Console.ReadKey(); } } }