次の方法で共有


仮想テーブルを有効にして Dataverse イベントをサポートする

行が追加、変更、または削除されたトリガーの場合、仮想エンティティが非同期 Dataverse Event Framework パイプライン イベントおよび PowerAutomate Dataverse コネクタに参加することを許可できます。 この機能は、Dataverse ビジネス イベントの一部として有効になります。 詳細情報: Microsoft Dataverse ビジネス イベント

この記事で説明する構成がないと、ほとんどの仮想エンティティは、他のエンティティと同様に Event Framework パイプラインに参加しません。 仮想エンティティはイベント パイプラインに参加しないため、発生する Create、Update、Delete (CUD) イベントに対してプラグイン ステップを登録することはできません。また、Power Automate Dataverse コネクタのこれらのエンティティに対して CUD イベントが表示されますが、ユーザーがそれらを使用するフローを保存しようとするとエラーがスローされます。

これは、仮想エンティティが外部ソースに格納されているデータを表しているためです。 Dataverse はクライアントとしてそのデータ ソースにアクセスできますが、他のシステムでは、Dataverse イベント フレームワークを通過することなく、いつでもそのデータを更新できます。

これを有効にするには、次の 2 つの手順があります。

  1. 仮想エンティティ メタデータと呼ばれるテーブル内のデータの構成。 このテーブルのデータを有効にするように構成されている場合、一連の新しい API によって、CUD イベントが発生したときに外部システムが Dataverse に通知する手段が提供されます。

    仮想エンティティ メタデータ行が EntityMetadata.Metadataid に関連している場合、外部ソースが仮想テーブルに通知できるかどうかを制御する3つの設定があります。

    仮想エンティティ メタデータの IsOnExternalCreatedEnabledIsOnExternalDeletedEnabled、および IsOnExternalUpdatedEnabled のブールプロパティを使用して個別に有効にすると、次のバインドされたアクションが外部サービスによって呼び出されます。

    アクション/メッセージ Description
    OnExternalCreated Dataverse の仮想テーブルとして公開されている外部システムで作成されたレコードに関するデータを格納します。
    OnExternalUpdated Dataverse の仮想テーブルとして公開されている外部システムで更新されたレコードに関するデータを格納します。
    OnExternalDeleted Dataverse の仮想テーブルとして公開されている外部システムで削除されたレコードに関するデータを格納します。
  2. データを制御する外部システムは、仮想エンティティ メタデータにデータがある API を使用して、認証済みの HTTP 要求を Dataverse に送信する必要があります。 認証されたサービス プリンシパル アカウントは、通常、この呼び出しを実行します。 詳細情報: サーバー間 (S2S) 認証を使用して Web アプリケーションを作成する

    ただし、Dataverse の呼び出しを実行できるアプリケーションまたはユーザーは、イベントが発生したことを Dataverse に通知するために必要な http 要求を送信できます。

OData プロバイダーと非リレーショナル日付ソースを使用する仮想エンティティでは、特定のプラグイン ステップの登録が許可される場合があります(たとえば、トランザクションの外部のイベントに対してのみ)。 ただし、これらのイベントは、Power Automate Dataverse コネクタでは使用できません。 この動作に変更はありません。 ただし、より信頼性の高いイベント通知を行うには、このトピックで説明する方法をお勧めします。

仮想テーブルの通知 API を有効にする方法

通知 API は、作成者ポータル (make.powerapps.com/) で手動で構成するか、コードを使用して有効にすることができます。

作成者ポータルを使用して手動で有効にする

たとえば、これらのプロパティを持つ Person 仮想テーブルがあるとします。 Name プロパティは new_People

new_people仮想テーブルのプロパティ。

  1. Power Apps (make.powerapps.com) で、ソリューション内で [ +新規 ] を選択し、[ 仮想エンティティ メタデータ] を選択します。

    ソリューションに新しい virtualentitymetadata を追加します。

    これにより、次の形式が開きます。

    virtualentitymetadata フォーム。

  2. フォームに入力し、[ 拡張エンティティ ID ] の値を仮想テーブルの名前に設定します。 3 つのメッセージすべてを有効にする必要はありません。 それらの 1 つ以上を設定し、後で残りを有効にするために戻ってくることができます。

これらのメッセージを有効にすると、「 仮想テーブルをサポートするために作成されたメッセージを表示する」の手順を使用して、追加された内容を確認して確認できます。

Maker ポータルを使用して管理プロパティを設定する

マネージド ソリューションをインストールするユーザーが仮想エンティティ メタデータの動作を変更しないようにするには、次の手順を使用して、管理プロパティを設定する必要があります。

  1. ソリューションで、仮想エンティティ メタデータを選択し、省略記号 (...) を選択し、[ 管理プロパティ] を選択します。

    [管理プロパティ] に移動します。

  2. [管理プロパティ] ウィンドウで、[ カスタマイズを許可] の選択を解除し 、[完了] をクリックします。

    [カスタマイズを許可] の選択を解除します。

    この設定は、仮想エンティティ メタデータ レコードがマネージド ソリューションに含まれるまで何も行いません。

コードを使用して有効にする

仮想エンティティの仮想エンティティ メタデータの作成を自動化したい場合があります。

VirtualEntityMetadata テーブルには、次の列を設定できます。

Schema Name
論理名
表示される名前 タイプ Description
ExtensionOfRecordId
extensionofrecordid
仮想エンティティ 検索 これらの設定の対象となる仮想エンティティの名前。
IsCustomizable
iscustomiable
カスタマイズ可能 ManagedProperty マネージド ソリューションに含めるときに、仮想エンティティ メタデータを変更または削除できるかどうかを制御します。
IsOnExternalCreatedEnabled
isonexternalcreatedenabled
外部作成メッセージを有効にする ブール値 外部データ ソースで作成された新しいレコードに関する情報をメッセージで送信できるようにします。
IsOnExternalDeletedEnabled
isonexternaldeletedenabled
外部削除メッセージを有効にする ブール値 メッセージが外部データ ソース内の削除されたレコードに関する情報を送信できるようにします。
IsOnExternalUpdatedEnabled
isonexternalupdatedenabled
外部更新メッセージを有効にする ブール値 メッセージが外部データ ソース内の更新されたレコードに関する情報を送信できるようにします。
Name
name
名前 String 設定の名前。
VirtualEntityMetadataId
virtualentitymetadataid
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 アクションであることがわかります。 OnExternalDeletedOnExternalUpdatedに関する同様のアクションがあります。

<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>

プラグイン登録ツールを使用してメッセージを表示する

プラグイン登録ツールを使用してプラグインステップを登録すると、これらのメッセージが表示されます。

new_people エンティティの OnExternalCreated メッセージにプラグイン ステップを登録する。

メッセージを使用して 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 ビジネス イベント
仮想テーブル (エンティティ) を始める