組織サービス コンテキスト クラスの使用

 

公開日: 2017年1月

対象: Dynamics 365 (online)、Dynamics 365 (on-premises)、Dynamics CRM 2016、Dynamics CRM Online

Microsoft Dynamics 365 (オンラインおよび設置型) では、OrganizationServiceProxy クラスを使用して Web サービスにアクセスできます。 または、コード生成ツールで生成された OrganizationServiceContext を使用して、追加機能にアクセスできます。OrganizationServiceContext クラスにより、変更を追跡し、ID およびリレーションシップを管理し、Microsoft Dynamics 365 LINQ プロバイダーにアクセスすることができます。 このクラスには、コンテキストが追跡するデータに対して変更を送信するための OrganizationServiceContext.SaveChanges メソッドも含まれています。 このクラスは、Windows Communication Foundation (WCF) データ サービスの DataServiceContext クラスと同じ概念に基づいています。

このクラスを生成するには、事前バインドの型を生成するときに /serviceContextName パラメーターの値を指定します。 コード生成ツールでは、この名前が生成したクラスの名前として使用されます。 コード生成ツールの使用方法の詳細については、「コード生成ツール (CrmSvcUtil.exe) を使用して事前バインド型エンティティ クラスを作成する」を参照してください。 アプリケーション、プラグイン、およびワークフロー活動を開発する際に、組織サービス コンテキストを使用できます。

このトピックの内容

OrganizationServiceContext クラスの使用方法

OrganizationServiceContext クラスによる変更の追跡

OrganizationServiceContext クラスによる関連オブジェクトの追跡

OrganizationServiceContext クラスによる変更の保存

コンテキストが変更された場合の仮想メソッドの使用

OrganizationServiceContext クラスの使用方法

コンテキスト クラスのインスタンスを作成するには、クラス コンストラクターに IOrganizationService インターフェイスを実装するオブジェクトを渡す必要があります。 1 つの方法として、OrganizationServiceProxy クラスのインスタンスを渡すことができます。IOrganizationService インターフェイスの詳細については、「組織サービスを使用したデータまたはメタデータの読み取りと書き込み」を参照してください。

次のコード例は、コンテキスト クラスの新しいインスタンスを作成する方法を示しています。 この例では、コード生成ツールで /serviceContextName パラメーターを使用して名前を指定することによって、コンテキスト クラスに AdventureWorksCycleServiceContext という名前が付けられています。

//For early bound types to work correctly, they have to be enabled on the proxy.
_serviceProxy.EnableProxyTypes();
AdventureWorksCycleServiceContext context = new AdventureWorksCycleServiceContext(_serviceProxy);

組織サービス コンテキスト オブジェクトを作成すれば、エンティティの作成、変更、または削除の追跡を開始できます。 たとえば、次のコード例は、サービス コンテキスト オブジェクトを使用して新しい取引先担当者のインスタンスを作成し、Microsoft Dynamics 365 Server に保存する方法を示しています。

//  Create a new contact record;
AdventureWorksCycleServiceContext context = new AdventureWorksCycleServiceContext (_serviceProxy);
Contact contact = new Contact() 
 {
   FirstName = "Pamela",
   LastName = "Brown",
   Address1_Line1 = "123 Easy St.",
   Address1_City = "Atlanta",
   Address1_StateOrProvince = "GA",
   Address1_PostalCode = "32254",
   Telephone1 = "425-555-5678"   };
context.AddObject(contact);
context.SaveChanges();

前述のコード例にはいくつかの注意点があります。 まず、新しい取引先担当者のインスタンスを作成した後、取引先担当者オブジェクトを OrganizationServiceContext.AddObject メソッドに渡し、コンテキストがオブジェクトの追跡を開始できるようにしている点です。 もう一つの注意点は、新しいオブジェクトをサーバーに保存するために OrganizationServiceContext.SaveChanges メソッドを使用していることです。

組織サービス コンテキストは Microsoft Dynamics 365 への送信対象となるあらゆるエンティティまたは関連付けを追跡する必要があります。 たとえば、LINQ クエリでレコードを取得してコンテキストでエンティティが追跡されるようにするか、OrganizationServiceContext.Attach メソッドを使用してコンテキストによるエンティティの追跡を開始することができます。 クライアント アプリケーションのデータを使用し、新しいエンティティの作成、関連エンティティの作成、既存のエンティティの変更を行うことができますが、変更を Microsoft Dynamics 365 Server にコミットするには追跡対象のエンティティで SaveChanges メソッドを呼び出す必要があります。

OrganizationServiceContext クラスによる変更の追跡

コンテキストによるエンティティの追跡方法を調べるには、エンティティ インスタンスの EntityState プロパティを確認します。 さまざまなメソッドを呼び出すか、LINQ クエリを使用して、Microsoft Dynamics 365 のエンティティを追跡するように組織サービス コンテキストに通知する必要があります。.NET 統合言語クエリ (LINQ) クエリから返されるすべてのエンティティはサービス コンテキストによって追跡されます。

サービス コンテキストにオブジェクトを追加するには、OrganizationServiceContext で次のいずれかのメソッドを呼び出します。

方法

用途

AddObject

組織サービス コンテキストが追跡するエンティティ セットにエンティティを追加します。 コンテキスト内のエンティティの状態は Created に設定されます。SaveChanges メソッドを呼び出すと、このレコードが作成されるか、またはサーバーに追加されます。

Attach

組織サービス コンテキストが追跡するエンティティ セットにエンティティを追加します。 コンテキスト内のエンティティの状態は Unchanged に設定されます。SaveChanges メソッドを呼び出しても、このエンティティは状態が変更されるまでサーバーに送信されません。

CreateQuery

組織サービス コンテキストが追跡するエンティティ セットにクエリの結果を追加します。

OrganizationServiceContext クラスによる関連オブジェクトの追跡

Dynamics 365 と Dynamics 365 (オンライン) では、組織サービス コンテキストでエンティティ間の関連付けを作成および更新できます。CrmSvcUtil ツールで生成され、事前バインド クラスに配置されるナビゲーション プロパティで、関連エンティティのプロパティや関連付けへのアクセスや変更を行うことができます。 関連エンティティをサーバーで更新できるようにするには、組織サービス コンテキストで関連エンティティを追跡する必要があります。

関連エンティティを操作する場合、およびサービス コンテキストにエンティティを追加する場合は、OrganizationServiceContext で次のメソッドを使用します。

方法

用途

AddRelatedObject

コンテキストにターゲットを追加します。 ターゲット エンティティに対して Attach メソッドを呼び出し、ソース エンティティとターゲット (関連) エンティティ間の AddLink メソッドを呼び出します。

AttachLink

追跡を行うコンテキストに関連エンティティを追加します。 コンテキスト内のエンティティの状態は Unchanged に設定されます。

AddLink

ソース エンティティとターゲット エンティティ間の関連付けを作成します。 コンテキストにターゲットを追加します。 コンテキスト内のターゲット エンティティの状態は Created に設定されます。

LoadProperty

指定した関連付けの関連エンティティ セットを読み込みます。 ナビゲーション プロパティを使用して関連エンティティにアクセスできるようになります。 親エンティティでナビゲーション プロパティを使用してエンティティにアクセスした後、関連エンティティで AddObject メソッドを呼び出します。

UpdateObject

OrganizationServiceContext 内の指定したエンティティの状態が Modified に変更されます。

DeleteObject

OrganizationServiceContext 内の指定したエンティティの状態が Deleted に変更されます。

ナビゲーション プロパティを使用して関連エンティティの読み込み

LINQ を使用して取得したエンティティの関連エンティティは、LoadProperty を使用してそれらを取得するまでは null です。 次のサンプル コードは、特定の取引先担当者レコードに関連付けられているタスク レコードにアクセスする方法を示しています。

Contact pam = context.ContactSet.Where(c => c.FirstName == "Pamela").FirstOrDefault();
if (pam != null)
{
// pam.Contact_Tasks is null until you use LoadProperty
    context.LoadProperty(pam, "Contact_Tasks");
    Task firstTask = pam.Contact_Tasks.FirstOrDefault();
}

OrganizationServiceContext クラスによる変更の保存

組織サービス コンテキストは追跡中のエンティティのグラフを保持します。 組織サービス コンテキストがエンティティの変更を処理し、サーバーに送信する順序が重要です。 主エンティティの更新が処理された後に関連エンティティが処理されます。 関連エンティティによって主エンティティに値が設定されると、その値がサーバーでのデータの更新時に使用されます。

エンティティ情報の保存時にエラーが発生した場合、SaveChangesResult を保持する新しい例外の種類が OrganizationServiceContext.SaveChanges メソッドによってスローされます。この動作はメソッドに渡された SaveChangesOptions パラメーターの値に関係なく発生します。

コンテキストが変更された場合の仮想メソッドの使用

場合によっては、OrganizationServiceContext の変更に基づいて操作を実行する必要があります。 この処理を簡素化するために、操作をインターセプトしたり、操作の通知を受けることができる仮想メソッドが用意されています。 仮想メソッドを利用するには、OrganizationServiceContext を継承するか、生成された組織サービス コンテキストを変更する必要があります。仮想メソッドの一覧を次の表に示します。

方法

説明

OnBeginEntityTracking

エンティティを OrganizationServiceContext にアタッチした後に呼び出します。

OnBeginLinkTracking

リンクを OrganizationServiceContext にアタッチした後に呼び出します。

OnEndEntityTracking

エンティティを OrganizationServiceContext からデタッチした後に呼び出します。

OnEndLinkTracking

リンクを OrganizationServiceContext からデタッチした後に呼び出します。

OnExecuting

要求を Microsoft Dynamics 365 Server に送信する直前に呼び出します。

OnExecute

例外が発生したかどうかに関係なく、要求を Microsoft Dynamics 365 Server に送信した直後に呼び出します。

OnSavingChanges

SaveChanges を呼び出した後の操作の前に呼び出します。

OnSaveChanges

SaveChanges の呼び出しに関するすべての操作が完了したとき、またはエラーが発生したときに呼び出します。

関連項目

IOrganizationService
OrganizationServiceContext
コードでの事前バインド型エンティティ クラスの使用
サンプル: 複雑な LINQ クエリ
コード生成ツール (CrmSvcUtil.exe) を使用して事前バインド型エンティティ クラスを作成する
作成、更新、および削除の事前バインド エンティティ クラスの使用

Microsoft Dynamics 365

© 2017 Microsoft. All rights reserved. 著作権