Habilitar las tablas virtuales para admitir eventos de Dataverse
Puede permitir que las entidades virtuales participen en eventos de canalización de Dataverse Event Framework y en el desencadenador Cuando se agrega, modifica o elimina una fila del conector PowerAutomate Dataverse. Esta capacidad está habilitada como parte de los eventos empresariales de Dataverse. Más información: Eventos empresariales de Microsoft Dataverse
Sin la configuración descritas en este artículo, la mayoría de las entidades virtuales no participan en la canalización de Event Framework como otras entidades. Debido a que las entidades virtuales no participan en la canalización del evento, no puede registrar los pasos del complemento en los eventos de creación, actualización y eliminación (CUD) que se producen, y aunque los eventos de CUD aparecen para estas entidades en el conector de Power Automate Dataverse, se produce un error cuando las personas intentan guardar un flujo que los usa.
Esto se debe a que las entidades virtuales representan datos almacenados en una fuente externa. Dataverse tiene acceso a ese origen de datos como cliente, pero otros sistemas pueden actualizar esos datos en cualquier momento sin pasar por el marco de eventos de Dataverse.
Hay dos pasos para habilitar esto:
Configurar datos en una tabla llamada Metadatos de entidad virtual. Cuando los datos de esta tabla se configuran para habilitarlos, un conjunto de nuevas API proporcionan los medios para que el sistema externo notifique a Dataverse cuando ocurren los eventos CUD.
Cuando hay una fila de metadatos de entidad virtual asociada con EntityMetadata.Metadataid para una tabla virtual, las siguientes tres configuraciones pueden controlar si una fuente externa puede notificar a su tabla virtual.
Cuando se habilitan individualmente usando las propiedades booleanas
IsOnExternalCreatedEnabled
,IsOnExternalDeletedEnabled
, andIsOnExternalUpdatedEnabled
de los metadatos de la entidad virtual, las siguientes acciones enlazadas están disponibles para ser llamadas por servicios externos.Acción o mensaje Descripción OnExternalCreated
Contiene datos sobre un registro que se creó en un sistema externo expuesto como tabla virtual en Dataverse. OnExternalUpdated
Contiene datos sobre un registro que se actualizó en un sistema externo expuesto como tabla virtual en Dataverse. OnExternalDeleted
Contiene datos sobre un registro que se eliminó en un sistema externo expuesto como tabla virtual en Dataverse. El sistema externo que controla los datos debe enviar una solicitud HTTP autenticada a Dataverse utilizando las API que tienen datos en los metadatos de la entidad virtual. Una cuenta principal de servicio autenticada suele realizar esta llamada. Más información: Crear aplicaciones web mediante la autenticación de servidor a servidor (S2S)
Pero cualquier aplicación o usuario que pueda realizar una llamada a Dataverse puede enviar la solicitud http necesaria para notificar a Dataverse que el evento ocurrió.
Nota
Las entidades virtuales que utilizan OData Provider y fuentes de fechas no relacionales pueden permitir ciertos registros de pasos de complementos, por ejemplo, solo en eventos fuera de la transacción. Pero estos eventos no están disponibles para su uso con el conector de Power Automate Dataverse. No es necesario cambiar este comportamiento. Pero, para una notificación de eventos más confiable, se recomienda el enfoque descrito en este tema.
Cómo habilitar las API de notificación para tablas virtuales
Puede habilitar las API de notificación configurándolas manualmente en el portal de creadores (make.powerapps.com/) o usando código.
Habilitar manualmente usando el portal de creadores
Digamos que tenemos una tabla virtual de persona con estas propiedades, la propiedad Name es new_People
.
En Power Apps (make.powerapps.com), dentro de su solución, seleccione +Nuevo y luego seleccione Metadatos de entidad virtual.
Esto abre el siguiente formulario:
Complete el formulario, configurando el valor Id. de entidad de extensión con el nombre de su tabla virtual. No es necesario que habilite los tres mensajes. Puede configurar uno o más y volver para habilitar el resto más tarde.
Cuando haya habilitado estos mensajes, puede observar y confirmar lo que se agregó usando los pasos en Ver los mensajes creados para apoyar su mesa virtual.
Establecer propiedades administradas mediante el portal de creadores
Si no desea que las personas que instalan su solución administrada cambien los comportamientos de los metadatos de la entidad virtual, debe configurar la propiedad administrada para evitarlo mediante los siguientes pasos.
En su solución, seleccione los metadatos de la entidad virtual y seleccione los puntos suspensivos (...) y luego seleccione Propiedades administradas.
En el panel Propiedades administradas, anule la selección de Permitir personalizaciones y presione Hecho.
Esta configuración no hará nada hasta que el registro de metadatos de la entidad virtual se incluya en una solución administrada.
Habilitar con código
Es posible que desee automatizar la creación de metadatos de entidad virtual para sus entidades virtuales.
La tabla VirtualEntityMetadata
tiene las siguientes columnas que puede establecer:
Nombre de esquema Nombre lógico |
Nombre | Tipo | Descripción |
---|---|---|---|
ExtensionOfRecordId extensionofrecordid |
Entidad virtual | Búsqueda | El nombre de la entidad virtual para la que son estas configuraciones. |
IsCustomizable iscustomiable |
Es personalizable | ManagedProperty | Controla si los metadatos de la entidad virtual se pueden cambiar o eliminar cuando se incluyen en una solución administrada. |
IsOnExternalCreatedEnabled isonexternalcreatedenabled |
Habilitar mensaje de creación externo | Booleana | Permite que un mensaje envíe información sobre nuevos registros creados en el origen de datos externo. |
IsOnExternalDeletedEnabled isonexternaldeletedenabled |
Habilitar mensaje de elimnación externo | Booleana | Permite que un mensaje envíe información sobre nuevos registros eliminados en el origen de datos externo. |
IsOnExternalUpdatedEnabled isonexternalupdatedenabled |
Habilitar mensaje de actualización externo | Booleana | Permite que un mensaje envíe información sobre nuevos registros actualizados en el origen de datos externo. |
Name name |
Name | String | Nombre de la configuración. |
VirtualEntityMetadataId virtualentitymetadataid |
VirtualEntityMetadata | Uniqueidentifier | Identificador único de instancias de entidad. |
Al crear este tipo de componentes de la solución, le recomendamos que configure la propiedad administrada Es personalizable para que sea false
a menos que desee permitir que las personas que instalen su solución administrada puedan cambiar esta configuración.
También recomendamos que agregue el registro de metadatos de entidad virtual** a una solución específica cuando la cree. En los dos ejemplos siguientes, verá cómo se pasa Solution.UniqueName
con la solicitud que crea el registro.
Uso de la API web
Al utilizar la API web, la primera tarea es obtener el MetadataId
de la tabla virtual. El siguiente ejemplo devuelve el MetadataId
para una entidad virtual llamada new_people
.
Solicitud:
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]
Respuesta:
HTTP/1.1 200 OK
{
"@odata.context": "[Organization Uri]/api/data/v9.1/$metadata#EntityDefinitions(MetadataId)/$entity",
"MetadataId": "b198e6f3-3dd6-4c0b-9570-702f0c10d577"
}
Luego, cree el registro de metadatos de la entidad virtual mientras lo asocia tipo de entidad Entity
usando el MetadataId
recuperado en el primer paso.
Tenga en cuenta el uso del encabezado MSCRM.SolutionUniqueName
establecido en el valor Solution.UniqueName
. Esto agregará el registro de metadatos de la entidad virtual a la solución a medida que se crea. Más información: Ecabezados HTTP
Solicitud:
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)"
}
Respuesta:
HTTP/1.1 204 No Content
Usar SDK para .NET
Independientemente de si utiliza tipos de enlace temprano o tardío, la primera tarea es recuperar el MetadataId
de la tabla, que se recupera de la misma forma para ambos casos. En este caso, para una tabla virtual llamada new_people
utilizando CrmServiceClient. Alternativamente, se puede usar la clase 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;
Usando tipos de enlace de tiempo de compilación
Con tipos de enlace temprano, puede usar la clase VirtualEntityMetadata
generada con el comando de Power Platform CLI pac modelbuilder build. Más información: Programación en tiempo de ejecución y en tiempo de compilación con SDK para .NET
var virtualEntityMetadata = new VirtualEntityMetadata
{
Name = "Person Virtual Metadata",
ExtensionOfRecordId = new EntityReference("entity", entityId.Value),
IsCustomizable = new BooleanManagedProperty(false),
IsOnExternalCreatedEnabled = true,
IsOnExternalDeletedEnabled = true,
IsOnExternalUpdatedEnabled = true,
};
Usando tipos de enlace de tiempo de ejecución
Hay dos formas de crear una instancia de metadatos de la entidad virtual utilizando tipos de enlace tardío, cualquiera de las dos es equivalente:
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;
O:
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}
}
};
Creando el registro
Al crear el registro, utilice la clase CreateRequest en lugar del método IOrganizationService.Create para que pueda incluir el parámetro opcional SolutionUniqueName
que agregará el registro a su solución cuando lo cree. Más información: Pasar parámetros opcionales con una solicitud
var createRequest = new CreateRequest
{
Target = virtualEntityMetadata
};
createRequest["SolutionUniqueName"] = "YourSolutionUniqueName";
service.Execute(createRequest);
Ver los mensajes creados para apoyar su tabla virtual
Una manera fácil de verificar que los mensajes que habilitó existen es examinar el documento de servicio de metadatos de la API web $.
Puede hacer esto en su navegador. Con la URL de su organización, escriba lo siguiente en su navegador:
[Organization Uri]/api/data/v9.2/$metadata
Este es un documento XML grande, pero puede buscar 'OnExternalCreated
' y encontrar la definición de la acción, en este caso para la tabla virtual 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>
Puede ver que se trata de una acción de OData vinculada al entityset new_people
.
Encontrará acciones similares para OnExternalDeleted
y 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>
Ver los mensajes usando la herramienta de registro del complemento
Cuando registre un paso de complemento utilizando la herramienta de registro de complemento, encontrará estos mensajes.
Usa los mensajes para notificar los cambios a Dataverse
Par notificar los cambios a Dataverse, debe llamar a la API adecuada. Puede usar el mensaje Dataverse con la API web o SDK para .NET.
Antes de utilizar estos mensajes, es posible que desee utilizar el procedimiento que se describe en Ver los mensajes creados para apoyar su tabla virtual para confirmar que existen.
Uso de la API web
Debido a que estas API son acciones de OData vinculadas a una colección de tablas, puede seguir el patrón documentado aquí: Utilizar acciones de API web> Acciones vinculadas> Acciones vinculadas a una colección de tablas. Los siguientes son algunos ejemplos que muestran el uso de la tabla virtual new_people
.
Si el sistema de llamada conoce el valor del id., siempre debe incluirse.
La instancia de entidad pasada usando el parámetro Destino debe tener la propiedad de anotación @odata.type
apropiada establecida para definir el tipo de entidad. Si no se incluye, se devolverá un error.
Estas llamadas siempre deben devolver 204: No Content
.
OnExternalCreated
Para esta acción, los valores deben incluir todas las propiedades establecidas cuando se creó el registro.
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
Para esta acción, solo se deben incluir aquellas propiedades que han cambiado.
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
Para esta acción, solo es necesario el identificador único del registro.
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"
}
}
Uso del SDK para .NET
Al usar el SDK para .NET, puede usar tipos de enlace temprano o tardío. Más información: Programación en tiempo de ejecución y en tiempo de compilación con SDK para .NET
Tipos de enlace de tiempo de compilación
Este ejemplo usa CrmServiceClient con tipos de enlace en tiempo de compilación, aunque también se puede usar 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
};
Tipos de enlace de tiempo de ejecución
Este ejemplo usa CrmServiceClient con tipos de enlace en tiempo de ejecución, aunque también se puede usar 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);
Consulte también
Marco de trabajo de eventos
Eventos de negocio de Microsoft Dataverse
Introducción a las tabla (entidades) virtuales