行が追加、変更、または削除されたトリガーの場合、仮想エンティティが非同期 Dataverse Event Framework パイプライン イベントおよび PowerAutomate Dataverse コネクタに参加することを許可できます。 この機能は、Dataverse ビジネス イベントの一部として有効になります。 詳細情報: Microsoft Dataverse ビジネス イベント
この記事で説明する構成がないと、ほとんどの仮想エンティティは、他のエンティティと同様に Event Framework パイプラインに参加しません。 仮想エンティティはイベント パイプラインに参加しないため、発生する Create、Update、Delete (CUD) イベントに対してプラグイン ステップを登録することはできません。また、Power Automate Dataverse コネクタのこれらのエンティティに対して CUD イベントが表示されますが、ユーザーがそれらを使用するフローを保存しようとするとエラーがスローされます。
これは、仮想エンティティが外部ソースに格納されているデータを表しているためです。 Dataverse はクライアントとしてそのデータ ソースにアクセスできますが、他のシステムでは、Dataverse イベント フレームワークを通過することなく、いつでもそのデータを更新できます。
これを有効にするには、次の 2 つの手順があります。
仮想エンティティ メタデータと呼ばれるテーブル内のデータの構成。 このテーブルのデータを有効にするように構成されている場合、一連の新しい API によって、CUD イベントが発生したときに外部システムが Dataverse に通知する手段が提供されます。
仮想エンティティ メタデータ行が EntityMetadata.Metadataid に関連している場合、外部ソースが仮想テーブルに通知できるかどうかを制御する3つの設定があります。
仮想エンティティ メタデータの
IsOnExternalCreatedEnabled、IsOnExternalDeletedEnabled、およびIsOnExternalUpdatedEnabledのブールプロパティを使用して個別に有効にすると、次のバインドされたアクションが外部サービスによって呼び出されます。アクション/メッセージ Description OnExternalCreatedDataverse の仮想テーブルとして公開されている外部システムで作成されたレコードに関するデータを格納します。 OnExternalUpdatedDataverse の仮想テーブルとして公開されている外部システムで更新されたレコードに関するデータを格納します。 OnExternalDeletedDataverse の仮想テーブルとして公開されている外部システムで削除されたレコードに関するデータを格納します。 データを制御する外部システムは、仮想エンティティ メタデータにデータがある API を使用して、認証済みの HTTP 要求を Dataverse に送信する必要があります。 認証されたサービス プリンシパル アカウントは、通常、この呼び出しを実行します。 詳細情報: サーバー間 (S2S) 認証を使用して Web アプリケーションを作成する
ただし、Dataverse の呼び出しを実行できるアプリケーションまたはユーザーは、イベントが発生したことを Dataverse に通知するために必要な http 要求を送信できます。
注
OData プロバイダーと非リレーショナル日付ソースを使用する仮想エンティティでは、特定のプラグイン ステップの登録が許可される場合があります(たとえば、トランザクションの外部のイベントに対してのみ)。 ただし、これらのイベントは、Power Automate Dataverse コネクタでは使用できません。 この動作に変更はありません。 ただし、より信頼性の高いイベント通知を行うには、このトピックで説明する方法をお勧めします。
仮想テーブルの通知 API を有効にする方法
通知 API は、作成者ポータル (make.powerapps.com/) で手動で構成するか、コードを使用して有効にすることができます。
作成者ポータルを使用して手動で有効にする
たとえば、これらのプロパティを持つ Person 仮想テーブルがあるとします。 Name プロパティは new_People。
Power Apps (make.powerapps.com) で、ソリューション内で [ +新規 ] を選択し、[ 仮想エンティティ メタデータ] を選択します。
これにより、次の形式が開きます。
フォームに入力し、[ 拡張エンティティ ID ] の値を仮想テーブルの名前に設定します。 3 つのメッセージすべてを有効にする必要はありません。 それらの 1 つ以上を設定し、後で残りを有効にするために戻ってくることができます。
これらのメッセージを有効にすると、「 仮想テーブルをサポートするために作成されたメッセージを表示する」の手順を使用して、追加された内容を確認して確認できます。
Maker ポータルを使用して管理プロパティを設定する
マネージド ソリューションをインストールするユーザーが仮想エンティティ メタデータの動作を変更しないようにするには、次の手順を使用して、管理プロパティを設定する必要があります。
ソリューションで、仮想エンティティ メタデータを選択し、省略記号 (...) を選択し、[ 管理プロパティ] を選択します。
[管理プロパティ] ウィンドウで、[ カスタマイズを許可] の選択を解除し 、[完了] をクリックします。
この設定は、仮想エンティティ メタデータ レコードがマネージド ソリューションに含まれるまで何も行いません。
コードを使用して有効にする
仮想エンティティの仮想エンティティ メタデータの作成を自動化したい場合があります。
VirtualEntityMetadata テーブルには、次の列を設定できます。
| Schema Name 論理名 |
表示される名前 | タイプ | Description |
|---|---|---|---|
ExtensionOfRecordIdextensionofrecordid |
仮想エンティティ | 検索 | これらの設定の対象となる仮想エンティティの名前。 |
IsCustomizableiscustomiable |
カスタマイズ可能 | ManagedProperty | マネージド ソリューションに含めるときに、仮想エンティティ メタデータを変更または削除できるかどうかを制御します。 |
IsOnExternalCreatedEnabledisonexternalcreatedenabled |
外部作成メッセージを有効にする | ブール値 | 外部データ ソースで作成された新しいレコードに関する情報をメッセージで送信できるようにします。 |
IsOnExternalDeletedEnabledisonexternaldeletedenabled |
外部削除メッセージを有効にする | ブール値 | メッセージが外部データ ソース内の削除されたレコードに関する情報を送信できるようにします。 |
IsOnExternalUpdatedEnabledisonexternalupdatedenabled |
外部更新メッセージを有効にする | ブール値 | メッセージが外部データ ソース内の更新されたレコードに関する情報を送信できるようにします。 |
Namename |
名前 | String | 設定の名前。 |
VirtualEntityMetadataIdvirtualentitymetadataid |
VirtualEntityMetadata | Uniqueidentifier | エンティティ インスタンスを表す一意の識別子 |
これらの種類のソリューション コンポーネントを作成する場合は、マネージド ソリューションをインストールするユーザーがこれらの設定を変更できるようにする場合を除き、 IsCustomizable 管理プロパティを false に設定することをお勧めします。
また、仮想エンティティ メタデータ** レコードは、作成時に特定のソリューションに追加することをお勧めします。 次の両方の例では、レコードを作成する要求で Solution.UniqueName がどのように渡されるかを確認します。
Web API の使用
Web API を使用する場合、最初のタスクは仮想テーブルの MetadataId を取得することです。 次の例では、MetadataIdという名前の仮想エンティティのnew_peopleを返します。
要求:
GET [Organization Uri]/api/data/v9.1/EntityDefinitions(LogicalName='new_people')?$select=MetadataId HTTP/1.1
OData-MaxVersion: 4.0
OData-Version: 4.0
Accept: application/json
Authorization: Bearer [REDACTED]
応答:
HTTP/1.1 200 OK
{
"@odata.context": "[Organization Uri]/api/data/v9.1/$metadata#EntityDefinitions(MetadataId)/$entity",
"MetadataId": "b198e6f3-3dd6-4c0b-9570-702f0c10d577"
}
次に、最初の手順で取得したEntityを使用して、仮想エンティティ メタデータ レコードを MetadataId エンティティ型に関連付けながら作成します。
MSCRM.SolutionUniqueName値に設定されたSolution.UniqueName ヘッダーの使用に注意してください。 これにより、仮想エンティティ メタデータ レコードが作成されるときにソリューションに追加されます。 詳細情報: HTTP ヘッダー
要求:
POST [Organization Uri]/api/data/v9.1/virtualentitymetadatas HTTP/1.1
MSCRM.SolutionUniqueName: YourSolutionUniqueName
OData-MaxVersion: 4.0
OData-Version: 4.0
Accept: application/json
Authorization: Bearer [REDACTED]
Content-Type: application/json; charset=utf-8
{
"@odata.type": "Microsoft.Dynamics.CRM.virtualentitymetadata",
"name": "Person Virtual Metadata",
"iscustomizable": {
"@odata.type": "Microsoft.Dynamics.CRM.BooleanManagedProperty",
"Value": false,
"CanBeChanged": false
},
"isonexternalcreatedenabled": true,
"isonexternaldeletedenabled": true,
"isonexternalupdatedenabled": true,
"extensionofrecordid@odata.bind": "entities(b198e6f3-3dd6-4c0b-9570-702f0c10d577)"
}
応答:
HTTP/1.1 204 No Content
SDK for .NET の使用
早期バインド型と遅延バインド型のどちらを使用するかに関係なく、最初のタスクはテーブルの MetadataId を取得することです。これは両方のケースで同じ方法で取得されます。 この場合、CrmServiceClient を使用している仮想テーブル new_people について。 または、 ServiceClient クラスを使用できます。
var service = new CrmServiceClient(conn);
// var service = new ServiceClient(conn);
var retrieveEntityRequest = new RetrieveEntityRequest
{
LogicalName = "new_people",
EntityFilters = EntityFilters.Entity
};
var retrieveEntityResponse = (RetrieveEntityResponse)service.Execute(retrieveEntityRequest);
var entityId = retrieveEntityResponse.EntityMetadata.MetadataId;
事前バインド型の使用
事前バインド型では、VirtualEntityMetadataを使用して生成された クラスを使用できます。 詳細情報: .NET 用 SDK を使用した遅延バインディングおよび早期バインディングのプログラミング
var virtualEntityMetadata = new VirtualEntityMetadata
{
Name = "Person Virtual Metadata",
ExtensionOfRecordId = new EntityReference("entity", entityId.Value),
IsCustomizable = new BooleanManagedProperty(false),
IsOnExternalCreatedEnabled = true,
IsOnExternalDeletedEnabled = true,
IsOnExternalUpdatedEnabled = true,
};
遅延バインド型の使用
遅延バインド型を使用して仮想エンティティ メタデータ インスタンスをインスタンス化する方法は 2 つあります。どちらかが同等です。
var virtualEntityMetadata = new Entity("virtualentitymetadata");
virtualEntityMetadata["name"] = "Person Virtual Metadata";
virtualEntityMetadata["extensionofrecordid"] = new EntityReference("entity", entityId.Value);
virtualEntityMetadata["iscustomizable"] = new BooleanManagedProperty(false);
virtualEntityMetadata["isonexternalcreatedenabled"] = true;
virtualEntityMetadata["isonexternaldeletedenabled"] = true;
virtualEntityMetadata["isonexternalupdatedenabled"] = true;
または:
var virtualEntityMetadata = new Entity("virtualentitymetadata") {
Attributes = new AttributeCollection {
{ "name","Person Virtual Metadata" },
{ "extensionofrecordid", new EntityReference("entity", entityId.Value)},
{ "iscustomizable",new BooleanManagedProperty(false)},
{ "isonexternalcreatedenabled",true },
{ "isonexternaldeletedenabled",true },
{ "isonexternalupdatedenabled",true}
}
};
レコードの作成
レコードを作成するときは、IOrganizationService.Create メソッドではなく CreateRequest クラスを使用して、レコードを作成するときにソリューションに追加するSolutionUniqueName省略可能なパラメーターを含めることができます。 詳細情報: 要求で省略可能なパラメーターを渡す
var createRequest = new CreateRequest
{
Target = virtualEntityMetadata
};
createRequest["SolutionUniqueName"] = "YourSolutionUniqueName";
service.Execute(createRequest);
仮想テーブルをサポートするために作成されたメッセージを表示する
有効にしたメッセージが存在することを確認する簡単な方法は、Web API $metadata サービス ドキュメントを調べることです。
これはブラウザーで行うことができます。 組織の URL を使用して、ブラウザーに次のように入力します。
[Organization Uri]/api/data/v9.2/$metadata
これは大きな XML ドキュメントですが、"OnExternalCreated" を検索し、アクションの定義 (この場合は new_people 仮想テーブル) を検索できます。
<Action Name="OnExternalCreated" IsBound="true">
<Parameter Name="entityset" Type="Collection(mscrm.new_people)" Nullable="false"/>
<Parameter Name="Target" Type="mscrm.crmbaseentity" Nullable="false"/>
</Action>
これは、 new_people エンティティセットにバインドされた OData アクションであることがわかります。
OnExternalDeletedとOnExternalUpdatedに関する同様のアクションがあります。
<Action Name="OnExternalDeleted" IsBound="true">
<Parameter Name="entityset" Type="Collection(mscrm.new_people)" Nullable="false"/>
<Parameter Name="Target" Type="mscrm.crmbaseentity" Nullable="false"/>
</Action>
<Action Name="OnExternalUpdated" IsBound="true">
<Parameter Name="entityset" Type="Collection(mscrm.new_people)" Nullable="false"/>
<Parameter Name="Target" Type="mscrm.crmbaseentity" Nullable="false"/>
</Action>
プラグイン登録ツールを使用してメッセージを表示する
プラグイン登録ツールを使用してプラグインステップを登録すると、これらのメッセージが表示されます。
メッセージを使用して Dataverse に変更を通知する
変更を Dataverse に通知するには、適切な API を呼び出す必要があります。 Dataverse Web API または SDK for .NET を使用できます。
これらのメッセージを使用する前に、「 仮想テーブルをサポートするために作成されたメッセージを表示する 」の手順を使用して、メッセージが存在することを確認することができます。
Web API の使用
これらの API はテーブル コレクションにバインドされた OData アクションであるため、「 Web API アクションの使用> バインドされたアクション> テーブル コレクションにバインドされたアクション」に記載されているパターンに従うことができます。
new_people仮想テーブルの使用例を次に示します。
呼び出し元システムによって ID 値が認識されている場合は、常に含める必要があります。
ターゲット パラメーターを使用して渡されるエンティティ インスタンスには、エンティティの種類を定義するための適切な@odata.type注釈プロパティが設定されている必要があります。 これが含まれていない場合は、エラーが返されます。
これらの呼び出しは常に 204: No Contentを返す必要があります。
OnExternalCreated
このアクションでは、レコードの作成時に設定されたすべてのプロパティを値に含める必要があります。
POST [Organization Uri]/api/data/v9.1/new_peoples/Microsoft.Dynamics.CRM.OnExternalCreated HTTP/1.1
Authorization: Bearer [REDACTED]
Content-Type: application/json
{
"Target": {
"@odata.type": "Microsoft.Dynamics.CRM.new_people",
"new_name": "John",
"new_age": 23,
"new_lastname": "Doe",
"new_peopleid": "f6f5896b-bf08-455c-9bd3-526760cb3685"
}
}
OnExternalUpdated
このアクションでは、変更されたプロパティのみを含める必要があります。
POST [Organization Uri]/api/data/v9.1/new_peoples/Microsoft.Dynamics.CRM.OnExternalUpdated HTTP/1.1
Authorization: Bearer [REDACTED]
Content-Type: application/json
{
"Target": {
"@odata.type": "Microsoft.Dynamics.CRM.new_people",
"new_age": 24,
"new_peopleid": "f6f5896b-bf08-455c-9bd3-526760cb3685"
}
}
OnExternalDeleted
このアクションでは、レコードのユニーク識別子のみが必要です。
POST [Organization Uri]/api/data/v9.1/new_peoples/Microsoft.Dynamics.CRM.OnExternalDeleted HTTP/1.1
Authorization: Bearer [REDACTED]
Content-Type: application/json
{
"Target": {
"@odata.type": "Microsoft.Dynamics.CRM.new_people",
"new_peopleid": "f6f5896b-bf08-455c-9bd3-526760cb3685"
}
}
SDK for .NET の使用
SDK for .NET を使用する場合は、早期バインディング型または遅延バインディング型を使用できます。 詳細情報: .NET 用 SDK を使用した遅延バインディングおよび早期バインディングのプログラミング
事前バインド型
この例では、事前バインド型の CrmServiceClient を使用しますが、 ServiceClient も使用できます。
var service = new CrmServiceClient(conn);
// var service = new ServiceClient(conn);
//OnExternalCreated
var createPerson = new new_people
{
new_peopleId = new Guid("f6f5896b-bf08-455c-9bd3-526760cb3685"),
new_name = "John",
new_Age = 23,
new_LastName = "Doe"
};
var createRequest = new OnExternalCreatedRequest
{
Target = createPerson
};
service.Execute(createRequest);
//OnExternalUpdated
var updatePerson = new new_people
{
new_peopleId = new Guid("f6f5896b-bf08-455c-9bd3-526760cb3685"),
new_Age = 24
};
var updateRequest = new OnExternalUpdatedRequest
{
Target = updatePerson
};
service.Execute(updateRequest);
//OnExternalDeleted
var deletePerson = new new_people
{
new_peopleId = new Guid("f6f5896b-bf08-455c-9bd3-526760cb3685")
};
var deleteRequest = new OnExternalDeletedRequest
{
Target = deletePerson
};
遅延バインド型
この例では、遅延バインディング型の CrmServiceClient を使用しますが、 ServiceClient も使用できます。
var service = new CrmServiceClient(conn);
// var service = new ServiceClient(conn);
//OnExternalCreated
Entity createPerson = new Entity("new_people");
createPerson["new_peopleid"] = new Guid("f6f5896b-bf08-455c-9bd3-526760cb3685");
createPerson["new_name"] = "John";
createPerson["new_age"] = 23;
createPerson["new_lastname"] = "Doe";
var orgCreateRequest = new OrganizationRequest("OnExternalCreated");
orgCreateRequest["Target"] = createPerson;
service.Execute(orgCreateRequest);
//OnExternalUpdated
Entity updatePerson = new Entity("new_people");
updatePerson["new_peopleid"] = new Guid("f6f5896b-bf08-455c-9bd3-526760cb3685");
updatePerson["new_age"] = 24;
var orgUpdateRequest = new OrganizationRequest("OnExternalUpdated");
orgUpdateRequest["Target"] = updatePerson;
service.Execute(orgUpdateRequest);
//OnExternalDeleted
Entity deletePerson = new Entity("new_people");
deletePerson["new_peopleid"] = new Guid("f6f5896b-bf08-455c-9bd3-526760cb3685");
var orgDeleteRequest = new OrganizationRequest("OnExternalDeleted");
orgDeleteRequest["Target"] = deletePerson;
service.Execute(orgDeleteRequest);
こちらもご覧ください
イベント フレームワーク
Microsoft Dataverse ビジネス イベント
仮想テーブル (エンティティ) を始める