.NET 用 SDK を使用した遅延バインドと事前バインドのプログラミング

.NET 用 SDK のアセンブリで作業するときは、次の 2 つのスタイルを使用できます: 遅延バインド事前バインド

事前バインドと遅延バインドの重要な違いとして、型変換があります。 事前バインドではすべての型をコンパイル時にチェックできるので暗黙的なキャストが一切起こらないのに対し、遅延バインドではオブジェクトの作成時や型に対するアクションの実行時にのみ型のチェックが行われます。 Entity クラスでは、型を明示的に指定して暗黙的なキャストを防ぐ必要があります。

遅延バインドを使用して、コードをコンパイルしたときは使用できなかったカスタム テーブル (エンティティ) または列 (属性) で作業することができます。

遅延バインド

遅延バインド プログラミングでは、Entity クラスを使用し、LogicalName プロパティの値でテーブル行および列 (エンティティおよび属性) を参照する必要があります。

リレーションシップには LogicalName プロパティがないので、RelationshipMetadataBase.SchemaName を確認します。 プロパティが使用されます。

遅延バインド プログラミングの主な利点は、クラスを生成する必要がなく、またプロジェクト中に生成されたファイルを含む必要もありません。 生成されたファイルはかなり大きいです。

主な欠点:

  • エンティティ、属性および関連付けの名前に対するコンパイル時の検証は行なわれません。
  • メタデータの属性および関連付けの名前を知る必要があります。

ヒント

この情報を簡単に見つけることができるツールが、Metadata Browser です。 組織にダウンロードおよびインストールできるアプリです。 詳細: 環境に適切なメタデータ ブラウザ を参照してください。

次の例では、遅延バインド スタイルを使うアカウントを作成します。

//Use Entity class specifying the entity logical name
var account = new Entity("account");

// set attribute values
    // string primary name
    account["name"] = "Contoso";            
    // Boolean (Two option)
    account["creditonhold"] = false;
    // DateTime
    account["lastonholdtime"] = new DateTime(2017, 1, 1);
    // Double
    account["address1_latitude"] = 47.642311;
    account["address1_longitude"] = -122.136841;
    // Int
    account["numberofemployees"] = 500;
    // Money
    account["revenue"] = new Money(new decimal(5000000.00));
    // Picklist (Option set)
    account["accountcategorycode"] = new OptionSetValue(1); //Preferred customer
                
//Create the account
Guid accountid = svc.Create(account);

事前バインド

事前バインド プログラミングでは、コード生成ツール (Power Platform CLI pac modelbuilder build command) を使用して、特定環境のテーブルおよび列定義 (エンティティおよび属性のメタデータ) に基づき、一連のクラスを最初に生成することを要求します。 詳細: .NET 用 SDK を使用して事前バインド プログラミングのクラスを生成

コード生成ツールを使い事前バインド クラスを生成した後、クラスとプロパティがそれぞれの SchemaName プロパティ値を使用するので、コードの記述中にエクスペリエンスは向上します。

クラスをインスタンス化し、Visual Studio IntelliSense にプロパティと関連付けの名前を提供させるだけです。

事前バインド プログラミングのため生成されたクラスは、環境に対して定義されているカスタム アクションの定義を含むことができます。 これにより、要求と返答の一対のクラスを提供し、カスタム アクションと使用できます。 詳細: Custom Actions

クラスが特定の環境インスタンスからテーブル定義を使用して生成され、各インスタンスは時間経過に伴い変化する異なるテーブルと列をもつかもしれません。 厳密に型指定されたクラスを生成する場合、存在しないテーブルの作業のためにコードを記述する必要があるかもしれません。

重要

使用する IOrganizationService メソッドを提供するために OrganizationServiceProxy を使用している場合は、OrganizationServiceProxy.EnableProxyTypes() を呼び出す必要があります。 事前バインド スタイルを有効にする方法。

次の例では、事前バインド スタイルを使うアカウントを作成します。

var account = new Account();
// set attribute values
    // string primary name
    account.Name = "Contoso";
    // Boolean (Two option)
    account.CreditOnHold = false;
    // DateTime
    account.LastOnHoldTime = new DateTime(2017, 1, 1);
    // Double
    account.Address1_Latitude = 47.642311;
    account.Address1_Longitude = -122.136841;
    // Int
    account.NumberOfEmployees = 500;
    // Money
    account.Revenue = new Money(new decimal(5000000.00));
    // Picklist (Option set)
    account.AccountCategoryCode = new OptionSetValue(1); //Preferred customer

//Create the account
Guid accountid = svc.Create(account);

どちらのスタイルか選択

どちらのプログラミング スタイルを使うかは自由に決定できます。 次の表では、それぞれの利点と欠点が表示されます。

事前バインド 遅延バインド
コンパイル時にエンティティ、属性および関連付けの名前を確認できます。 エンティティ、属性および関連付けの名前のコンパイル時の検証はありません。
エンティティ クラスを生成する必要があります。 エンティティ クラスを生成する必要がありません。
IntelliSense サポートの向上 IntelliSense サポートの低下
記述するコードを削減し、コードの可読性を高めます 記述するコードを増加させ、コードの可読性を低下させます
パフォーマンスのわずかな低下 パフォーマンスのわずかな向上

事前および遅延バインドの組み合わせ

すべての生成されたクラスは遅延バインド プログラミングで使用された Entity クラスから継承したので、エンティティ、属性およびクラス内の定義されない関連付けで作業できます。

次の例では、 OrganizationServiceContextを使用して早期バインドメソッドと遅延バインドメソッドを併用する一例を示します。

// Create an context object  
AWCServiceContext context = new AWCServiceContext(_serviceProxy);  
  
// Instantiate an account object using the Entity class.  
Entity testaccount = new Entity("account");  
  
// Set several attributes. For account, only the name is required.   
testaccount["name"] = "Fourth Coffee";  
testaccount["emailaddress1"] = "marshd@contoso.com";  
  
// Save the entity using the context object.  
context.AddToAccountSet(testaccount);  
context.SaveChanges();  
  

カスタムの属性が生成されたクラスに含まれなかった場合でも、まだ使えます。

var account = new Account();
// set attribute values
    // string primary name
    account.Name = "Contoso";
    // A custom boolean attribute not included in the generated classes.
    account["sample_customboolean"] = false;


//Create the account
Guid accountid = svc.Create(account);

事前バインド インスタンスを遅延バインド インスタンスに割り当てる

次の例は、事前バインド インスタンスを遅延バインド インスタンスに割り当てる方法を示します。

Entity incident = ((Entity)context.InputParameters[ParameterName.Target]).ToEntity<Incident>();  
Task relatedEntity = new Task() { Id = this.TaskId };  
  
incident.RelatedEntities[new Relationship("Incident_Tasks")] =   
new EntityCollection(new Entity[] { relatedEntity.ToEntity<Entity>() });  

参照

.NET 用 SDK を使用したエンティティの操作
.NET 用 SDK を使用したテーブル行の作成
SDK for .NET を使用してテーブルの行を取得する
.NET 用 SDK を使用したクエリ データ
SDK for .NET を使用したテーブル行の更新と削除
.NET 用 SDK を使用したテーブル行の関連付けと関連付け解除
IOrganizationService インターフェイス
OrganizationServiceContext の使用

注意

ドキュメントの言語設定についてお聞かせください。 簡単な調査を行います。 (この調査は英語です)

この調査には約 7 分かかります。 個人データは収集されません (プライバシー ステートメント)。