組織サービスを使用した遅延バインドおよび事前バインドのプログラミング
注意
エンティティとテーブルの違いがわかりませんか? Microsoft Dataverse で「開発者: 用語を理解する」を参照してください。
組織サービスのアセンブリで作業するときは、遅延バインド および 事前バインド の 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);
事前バインド
事前バインド プログラミングでは、コード生成ツール (CrmSvcUtil.exe) を使用して、特定環境のテーブルおよび列定義 (エンティティおよび属性のメタデータ) に基づき、一連のクラスを最初に生成することを要求します。 詳細: 組織サービスを使用して事前バインド プログラミングのクラスを生成
コード生成ツールを使い事前バインド クラスを生成した後、クラスとプロパティがそれぞれの SchemaName プロパティ値を使用するので、コードの記述中にエクスペリエンスは向上します。
クラスをインスタンス化し、Visual Studio IntelliSense にプロパティと関連付けの名前を提供させるだけです。
事前バインド プログラミングのため生成されたクラスは、環境に対して定義されているカスタム アクションの定義を含むことができます。 これを使用して、要求と返答の一対のクラスを提供し、カスタム アクションと使用できます。 詳細: Custom Actions
アウトプットを変更するため、生成ツールのコードを拡張するオプションもあります。 1 つの拡張で、各オプション セット (選択肢) のオプション値の列挙を作成できます。 これにより、各選択肢の整数値を検索する必要がないので、優れたエクスペリエンスが提供されます。 詳細: 生成ツールのコードの拡張機能を作成
クラスが特定の環境インスタンスからテーブル定義を使用して生成され、各インスタンスは時間経過に伴い変化する異なるテーブルと列をもつかもしれません。 厳密に型指定されたクラスを生成する場合、存在しないテーブルの作業のためにコードを記述する必要があるかもしれません。
重要
使用する 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 organization service 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 organization service 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>() });
関連項目
組織サービスを使用したエンティティの操作
組織サービスを使用したテーブル行の作成
組織サービスを使用したテーブル行の取得
組織サービスを使用したクエリ データ
組織サービスを使用したテーブル行の更新と削除
組織サービスを使用したテーブル行の関連付けと関連付け解除
IOrganizationService インターフェイス
OrganizationServiceContext の使用
注意
ドキュメントの言語設定についてお聞かせください。 簡単な調査を行います。 (この調査は英語です)
この調査には約 7 分かかります。 個人データは収集されません (プライバシー ステートメント)。
フィードバック
フィードバックの送信と表示