SDK for .NET アセンブリを使用する場合は、遅延バインドと早期バインドの2つのプログラミングスタイルを使用できます。
早期バインディングと遅延バインディングの主な違いには、型変換が含まれます。 事前バインディングでは、暗黙的なキャストが行われないように、すべての型のコンパイル時チェックが提供されますが、遅延バインディングは、オブジェクトが作成されたとき、または型に対してアクションが実行された場合にのみ型をチェックします。 Entity クラスでは、暗黙的なキャストを防ぐために型を明示的に指定する必要があります。
遅延バインディングを使用すると、コードのコンパイル時に使用できなかったカスタム テーブル (エンティティ) または列 (属性) を操作できます。
遅延バインド
遅延バインド プログラミングでは、Entity クラスを使用し、LogicalName プロパティの値でテーブル行および列 (エンティティおよび属性) を参照する必要があります。
リレーションシップには LogicalName プロパティがないため、 RelationshipMetadataBase.SchemaName プロパティが使用されます。
遅延バインディングプログラミングの主な利点は、クラスを生成したり、その生成ファイルをプロジェクトに組み込む必要がないことです。 生成されるファイルは大きくなる可能性があります。
主な欠点は次のとおりです。
- エンティティ、属性、リレーションシップの名前に対するコンパイル時の検証は取得されません。
- メタデータ内の属性とリレーションシップの名前を知る必要があります。
ヒント
この情報を簡単に見つけるために使用できるツールは、メタデータ ブラウザーです。 これは、組織でダウンロードしてインストールできるアプリです。 詳細情報: 環境のメタデータを参照する
Example
次の例では、遅延バインディング スタイルを使用してアカウントを作成します。
//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 ビルド コマンドを使用して、特定の環境のテーブルと列の定義 (エンティティと属性のメタデータ) に基づいてクラスのセットを生成する必要があります。 詳細情報: SDK for .NET を使用して早期バインド プログラミング用のクラスを生成する
コード生成ツールを使用して事前バインドされたクラスを生成した後、クラスとプロパティはそれぞれの SchemaName プロパティ値を使用するため、コードを記述する際のエクスペリエンスが向上します。
クラスをインスタンス化し、Visual Studio IntelliSense でプロパティとリレーションシップの名前を指定するだけです。
早期バインド プログラミング用に生成されるクラスには、環境に対して定義されているカスタム アクションの定義を含めることもできます。 これにより、これらのカスタム アクションで使用する要求クラスと応答クラスのペアが提供されます。 詳細情報: カスタム アクション
クラスは特定の環境インスタンスのテーブル定義を使用して生成され、各インスタンスには異なるテーブルと列があり、時間の経過と同時に変更される可能性があります。 厳密に型指定されたクラスを生成する場合、存在しないテーブルの作業のためにコードを記述する必要があるかもしれません。
Important
OrganizationServiceProxyを使用して使用するIOrganizationService メソッドを提供する場合は、OrganizationServiceProxy.EnableProxyTypes() メソッドを呼び出して、事前バインド型を有効にする必要があります。
Example
次の例では、早期バインド方式を使用してアカウントを作成します。
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を使用して早期バインディングメソッドと遅延バインディング メソッドを混在させる 1 つの方法を示しています。
// 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>() });
こちらも参照ください
SDK for .NET を使用したエンティティ操作
.NET 用 SDK を使用したテーブル行の作成
.NET 用 SDK を使用したテーブル行の取得
SDK for .NET を使用してデータのクエリを実行する
.NET 用 SDK を使用したテーブル行の更新と削除
.NET 用 SDK を使用したテーブル行の関連付けと関連付け解除
IOrganizationService インターフェイス
OrganizationServiceContext の使用