Dynamics 365 の Dataverse(旧 Common Data Service, CDS) では、C# を使用してデータを操作する際に、
主に Early Bound(早期バインディング) と Late Bound(遅延バインディング) の2つの方法があります。
それぞれのアプローチにはメリット・デメリットがあり、プロジェクトの要件に応じて使い分ける必要があります。
Early Bound(早期バインディング)
特徴:
・コンパイル時にデータ構造が決まる(型安全)。
・C# のクラス(エンティティクラス)を生成 して利用する。
・CrmSvcUtil.exe または Power Platform Tools for Visual Studio を使ってエンティティクラスを生成する必要がある。
・ntelliSense(入力補完)対応 で、コードの記述が容易。
・コンパイル時に型チェック できるため、タイポやエラーを防げる。
・ただし、データモデルが変更された場合は、クラスを再生成する必要がある。
Early Bound のサンプルコード:
using (var service = new OrganizationService(context))
{
var contact = new Contact
{
FirstName = "太郎",
LastName = "山田",
EmailAddress1 = "taro.yamada@example.com"
};
service.Create(contact);
}
・Contact
クラスは、Dataverse から生成された型安全な C# クラス。
・FirstName
, LastName
, EmailAddress1
などのプロパティが事前に定義されており、IntelliSense が機能する。
Late Bound(遅延バインディング)
特徴:
・実行時にデータ構造を決定 するため、型が決まっていない(型安全ではない)。
・事前にエンティティクラスを生成する必要がない。
・汎用 Entity
クラスを使用 し、属性を文字列キーで指定する。
・データモデルの変更に対して柔軟 だが、IntelliSense が効かず、開発が難しくなる。
・プロパティ名を手入力する必要があり、タイポ(スペルミス)のリスクがある。
Late Bound のサンプルコード:
using (var service = new OrganizationService(context))
{
Entity contact = new Entity("contact");
contact["firstname"] = "太郎";
contact["lastname"] = "山田";
contact["emailaddress1"] = "taro.yamada@example.com";
service.Create(contact);
}
・Entity
クラス を使用して、Dataverse のテーブル(エンティティ)を動的に作成する。
・"firstname"
, "lastname"
, "emailaddress1"
などのプロパティ名は文字列で指定 するため、ミスしやすい。
・タイポがあってもコンパイル時にエラーにならず、実行時エラーが発生する 可能性がある。
Early Bound と Late Bound の比較
方式 | メリット | デメリット | 適用シナリオ |
---|
Early Bound | ✔ IntelliSense 対応 ✔ 型安全(コンパイル時チェック) ✔ コードが読みやすい | ✖ データモデル変更時にクラスの再生成が必要 ✖ 初期設定が必要 | 長期的なプロジェクト 安定したデータモデルを持つシステム |
Late Bound | ✔ 柔軟で迅速な開発が可能 ✔ スキーマ変更に強い ✔ 初期設定が不要 | ✖ IntelliSense が使えない ✖ 実行時エラーのリスクが高い ✖ コードの保守性が低い | プロトタイピング 頻繁にデータ構造が変わるシステム |
Early Bound と Late Bound 以外にも、Dataverse では以下の方法でデータを操作できます:
- LINQ クエリ(Early Bound を使用)
- FetchXML(SQL に近い XML ベースのクエリ)
- Web API (外部システムとの連携向け)
まとめ
✔ Early Bound を選ぶべきケース
→ 型安全性が重要 で、長期的に保守しやすいコードを書きたい場合
✔ Late Bound を選ぶべきケース
→ 柔軟性を重視 し、データモデルが頻繁に変更される場合
どちらの方法を選ぶかは、プロジェクトの性質と開発スタイルに依存します。
コメント