Morning Girl

Web API, Windows, C#, .NET, Dynamics 365/CRM etc..

【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をするものです。

・Dynamics CRM SDK 7.1

・.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();

        }
    }
}

参考URL

www.kingswaysoft.com