Use estos mensajes con el SDK para .NET
Es importante comprender que todas las operaciones de datos en Dataverse se definen como mensajes y las definiciones de estos mensajes se almacenan en Dataverse.
Cada mensaje tiene:
- Un nombre único
- Una colección de parámetros de entrada
- Una colección de parámetros de salida
Hay tres formas diferentes de usar un mensaje con el SDK para .NET, como se explica en las siguientes secciones:
método | Descripción |
---|---|
Clases OrganizationRequest y OrganizationResponse | Utilice estas clases cuando no tenga clases de solicitud y respuesta de SDK. Es posible que prefiera utilizar este enfoque en lugar de generar clases de solicitud y respuesta SDK cuando conoce el nombre del mensaje y los detalles de los parámetros de entrada y salida. |
Clases de solicitud y respuesta SDK | El uso de estas clases es la forma más común de usar los mensajes. Muchos mensajes ya tienen clases definidas en el SDK para .NET. Para las acciones personalizadas, puede generar clases. |
Métodos de IOrganizationService | El IOrganizationService proporciona algunos métodos para operaciones de datos comunes. Estos métodos son las formas más rápidas y fáciles de realizar las operaciones de datos más comunes. |
Clases OrganizationRequest y OrganizationResponse
Nota
El uso de las clases OrganizationRequest t OrganizationResponse no es la forma más común de usar los mensajes en Dataverse. Sin embargo, estas clases demuestran cómo se implementan los mensajes. Comprender esto es importante para entender cómo funcionan otras partes de Dataverse.
Puede usar un mensaje sin clases de solicitud y respuesta de SDK.
Usar la clase OrganizationRequest.
- Establezca OrganizationRequest.RequestName
- Establezca los elementos en la colección OrganizationRequest.Parameters
Envíe la solicitud mediante el método IOrganizationService.Execute, que devuelve una instancia OrganizationResponse.
Los elementos de la colección OrganizationResponse.Results contienen los resultados.
Por ejemplo, si desea crear un registro de cuenta, puede hacerlo de esta manera:
public static Guid OrganizationRequestExample(IOrganizationService service) {
// Instantiate an Entity instance of type 'account'
var account = new Entity("account");
account["name"] = "Test account";
// Instantiate a collection of parameters with one item 'Target',
// set to the account entity instance
ParameterCollection parameters = new ParameterCollection
{
{ "Target", account }
};
// Instantiate an OrganizationRequest instance setting the
// RequestName and Parameters
OrganizationRequest request = new OrganizationRequest()
{
RequestName = "Create",
Parameters = parameters
};
// Send the request using the IOrganizationService.Execute method
OrganizationResponse response = service.Execute(request);
// Parse the output parameter 'id' from the Results
return (Guid)response.Results["id"];
}
Para crear un registro de cuenta usando este método, necesita saber:
- El nombre del mensaje:
Create
. - El nombre y el tipo de datos de cada parámetro de entrada: un único parámetro denominado
Target
que es una Entidad. - El nombre y el tipo de datos de cada parámetro de salida: un único parámetro denominado
id
que es una Guid.
Esta información se almacena en Dataverse. La tabla SdkMessage contiene información sobre todos los mensajes.
Dataverse gestiona información sobre los parámetros de entrada y salida en tablas privadas. No necesita recuperarlo porque hay una manera más fácil: usar las clases de solicitud y respuesta del SDK.
Clases de solicitud y respuesta SDK
Las clases de solicitud y respuesta del SDK reducen la complejidad del uso de las clases OrganizationRequest y OrganizationResponse. No necesita saber el nombre del mensaje ni los parámetros de entrada y salida porque las clases los incluyen.
El SDK para .NET contiene definiciones para mensajes comunes Dataverse en estos espacios de nombres:
Espacio de nombres | Descripción |
---|---|
Microsoft.Xrm.Sdk.Messages | Mensajes para operaciones de datos comunes y mensajes utilizados para crear y modificar datos de esquema, también conocidos como metadatos. |
Microsoft.Crm.Sdk.Messages | Mensajes para operaciones y lógica empresarial para admitir capacidades especiales para admitir aplicaciones y administración del ciclo de vida de aplicaciones (ALM). Algunos mensajes en este espacio de nombres admiten capacidades que solo se encuentran en Microsoft Dynamics 365 Business Applications. |
Estas clases contienen propiedades para todos los parámetros de entrada y salida.
Las clases que terminan en
*Request
contienen las propiedades de los parámetros de entrada.Estas clases heredan de la clase OrganizationRequest.
Las clases que terminan en
*Response
contienen las propiedades de los parámetros de salida.Estas clases heredan de la clase OrganizationResponse.
Por ejemplo, para crear un registro, puede usar la clase Microsoft.Xrm.Sdk.Messages.CreateRequest para preparar la solicitud. Usar IOrganizationService.Ejecutar para enviar la solicitud y los resultados están en forma de una instancia de clase Microsoft.Xrm.Sdk.Messages.CreateResponse.
El siguiente ejemplo usa la clase Microsoft.Xrm.Sdk.Messages.CreateRequest con una clase de enlace anticipado generada para la entidad de cuenta:
public static Guid CreateRequestExample(IOrganizationService service)
{
// Instantiate an Account using generated early-bound class
var account = new Account
{
Name = "Test account"
};
// Instantiate a CreateRequest
var request = new CreateRequest
{
// Set the Target property
Target = account
};
// Send the request using the IOrganizationService.Execute method
// Cast the OrganizationResponse into a CreateResponse
var response = (CreateResponse)service.Execute(request);
// Return the id property value
return response.id;
}
Generar clases para las acciones personalizadas
Hay otros mensajes que no tienen clases en el SDK. Por ejemplo, las soluciones que se instalan con frecuencia incluyen nuevas definiciones de mensajes definidas como acciones personalizadas (API personalizada o acciones de proceso personalizadas). Aprender a crear los propios mensajes
Los desarrolladores pueden generar clases *Request
y *Response
para los mensajes encontrados en su entorno utilizando el Comando de compilación CLI pac modelbuilder de Power Platform. Usar el parámetro --generateActions para generar clases *Request
y *Response
. Obtener más información sobre cómo generar clases enlazadas de forma anticipada para el SDK para .NET
Pasar parámetros opcionales con una solicitud
Hay varios parámetros opcionales que puede pasar para aplicar comportamientos especiales a los mensajes. No puede usar los métodos IOrganizationService cuando usa parámetros opcionales. Debe utilizar las clases de solicitud SDK o la clase OrganizationRequest.
Más información: Usar parámetros opcionales
Métodos de IOrganizationService
Además de IOrganizationService.Execute método, el Interfaz IOrganizationService especifica que también se deben implementar los siguientes métodos. Estos métodos encapsulan las clases de Solicitud y Respuesta correspondientes:
Estos métodos simplifican la realización de estas operaciones con menos líneas de código. El siguiente ejemplo usa el método IOrganizationService.Create para crear un registro de cuenta:
public static Guid CreateMethodExample(IOrganizationService service)
{
// Instantiate an Account using generated early-bound class
var account = new Account
{
Name = "Test account"
};
// Use the Create method to get the id of the created account.
return service.Create(account);
}
Como puede ver, las operaciones de datos comunes se simplifican utilizando los métodos IOrganizationService y otros mensajes se hacen más fáciles de usar con las clases de Solicitud y Respuesta en los ensamblados del SDK o se generan con herramientas. La mayoría de las veces no necesita usar las clases subyacentes OrganizationRequest y OrganizationResponse, pero es importante comprender las diferentes opciones disponibles para usar mensajes, especialmente cuando se trabaja con complementos y API personalizados.
Trabajar con mensajes en complementos
Los datos que describen una operación en un complemento tienen la forma de IExecutionContext.InputParameters y IExecutionContext.OutputParameters.
En las etapas PreValidation
y PreOperation
antes de la operación main
de la canalización de eventos, IExecutionContext.InputParameters contiene OrganizationRequest.Parameters.
Con una API personalizada, su complemento lee IExecutionContext.InputParameters y contiene lógica para configurar IExecutionContext.OutputParameters como parte de la etapa de operación main
.
Después de la etapa de operación main
, en el escenario PostOperation
, IExecutionContext.OutputParameters contiene OrganizationResponse.Results.
Conocer la estructura de los mensajes ayuda a comprender dónde encontrar los datos que desea comprobar o cambiar en el complemento.
Más información:
- Escriba complementos para ampliar los procesos de negocio
- Crear y usar API personalizadas
- Marco de trabajo de eventos
Mensajes privados
Microsoft Dataverse contiene algunos mensajes que no están diseñados para que los utilicen desarrolladores que no son de Microsoft. Microsoft agrega estos mensajes para habilitar la funcionalidad de la característica, pero también pueden agregarlos soluciones que no son de Microsoft con la característica API personalizada. Los mensajes privados se indican mediante la propiedad SdkMessage.IsPrivate.
Precaución
No debe utilizar mensajes privados a menos que los haya creado como una API personalizada. Al marcar un mensaje como privado, el editor de soluciones está diciendo explícitamente que no son compatibles con otras aplicaciones para usar el mensaje. Pueden quitar el mensaje o introducir cambios importantes en cualquier momento. No se admite el uso de estos mensajes por nadie que no sea editor de soluciones. No se admite la llamada a mensajes privados desde complementos.
Más información: Crear y usar API personalizadas
Soporte de tabla para mensajes
Algunos mensajes se pueden utilizar con varias tablas. Por ejemplo, los mensajes Create
, Update
, y Delete
se pueden usar para la mayoría de las tablas, pero es posible que algunas tablas no admitan todos los mensajes comunes.
Esta información se almacena en la Tabla SdkMessageFilter. Puede consultar esta tabla para determinar si puede usar un mensaje para una tabla.
Utilice este método estático para obtener una lista de nombres de mensajes que pueden funcionar con una tabla:
/// <summary>
/// Write the names of messages for a table to the console
/// </summary>
/// <param name="service">The authenticated IOrganizationService to use</param>
/// <param name="tableName">The logical name of the table</param>
static void OutputTableMessageNames(IOrganizationService service, string tableName)
{
var query = new QueryExpression(entityName: "sdkmessagefilter")
{
Criteria =
{
Conditions =
{
new ConditionExpression(
attributeName:"primaryobjecttypecode",
conditionOperator: ConditionOperator.Equal,
value: tableName)
}
},
// Link to SdkMessage to get the names
LinkEntities =
{
new LinkEntity(
linkFromEntityName:"sdkmessagefilter",
linkToEntityName: "sdkmessage",
linkFromAttributeName: "sdkmessageid",
linkToAttributeName: "sdkmessageid",
joinOperator: JoinOperator.Inner)
{
EntityAlias = "sdkmessage",
Columns = new ColumnSet("name"),
LinkCriteria =
{
Conditions =
{
// Don't include private messages
new ConditionExpression("isprivate", ConditionOperator.Equal, false)
}
}
}
}
};
EntityCollection results = service.RetrieveMultiple(query);
foreach (var entity in results.Entities)
{
Console.WriteLine(((AliasedValue)entity["sdkmessage.name"]).Value);
}
}
Si utiliza este método configurando el parámetro tableName
en account
, obtendrá resultados que incluyen estos nombres de mensajes:
Salida:
Assign
Create
Delete
GrantAccess
Merge
ModifyAccess
Retrieve
RetrieveMultiple
RetrievePrincipalAccess
RetrieveSharedPrincipalsAndAccess
RevokeAccess
SetState
SetStateDynamicEntity
Update
Nota
Algunos de estos mensajes están en desuso. SetState
y SetStateDynamicEntity
todavía existen, pero debe usar Update
en su lugar.
Soporte de mensaje para tablas
Algunos mensajes solo se pueden utilizar con tablas específicas. Por ejemplo, solo puede usar el mensaje RetrieveUnpublishedMultiple
con un conjunto específico de tablas que contienen datos que se pueden publicar.
Esta información se almacena en la Tabla SdkMessageFilter. Puede consultar esta tabla para determinar qué tablas pueden usarse para un mensaje específico.
Utilice este método estático para obtener una lista de nombres de tablas que pueden usarse con un mensaje:
/// <summary>
/// Write the names of tables for a message to the console
/// </summary>
/// <param name="service">The authenticated IOrganizationService to use</param>
/// <param name="messageName">The name of the message</param>
static void OutputTablesForMessage(IOrganizationService service, string messageName) {
var query = new QueryExpression(entityName: "sdkmessage")
{
Criteria = {
Conditions =
{
new ConditionExpression(
attributeName: "name",
conditionOperator: ConditionOperator.Equal,
value: messageName)
}
},
LinkEntities = {
new LinkEntity(
linkFromEntityName:"sdkmessage",
linkToEntityName: "sdkmessagefilter",
linkFromAttributeName: "sdkmessageid",
linkToAttributeName: "sdkmessageid",
joinOperator: JoinOperator.Inner)
{
EntityAlias = "sdkmessagefilter",
Columns = new ColumnSet("primaryobjecttypecode"),
}
}
};
EntityCollection results = service.RetrieveMultiple(query);
List<string> names = new List<string>();
foreach (var entity in results.Entities)
{
names.Add(((AliasedValue)entity["sdkmessagefilter.primaryobjecttypecode"]).Value as string);
}
names.Distinct().ToList().ForEach(name => Console.WriteLine(name));
}
Si utiliza este método configurando el parámetro messageName
en RetrieveUnpublishedMultiple
, obtendrá resultados que incluyen estos nombres de tablas:
Salida:
organizationui
systemform
savedquery
savedqueryvisualization
sitemap
hierarchyrule
appmodule
appconfig
appconfiginstance
webresource
mobileofflineprofile
mobileofflineprofileitem
mobileofflineprofileitemassociation
navigationsetting
appelement
appsetting
teammobileofflineprofilemembership
usermobileofflineprofilemembership
Nota
Para ciertos mensajes, puede encontrar que se devuelven valores de marcador de posición, como
DeletedEntity for objectTypeCode=11478
onew_system_donotuseentity_rp53fd1p1ekxpa_t12_b71d6344c5
. Estos no son nombres de tabla válidos. Ignore estos valores.Esta consulta también devolverá tablas privadas. En el ejemplo anterior:
organizationui
,hierarchyrule
,appelement
yappsetting
son tablas privadas y no se admiten para su uso.
Consulte también
Operaciones de tabla con el SDK para .NET
Uso ExecuteAsync para ejecutar mensajes forma asincrónica
Ejecutar mensajes en una sola transacción de la base de datos
Ejemplo: ejecutar varias solicitudes usando SDK para .NET
Nota
¿Puede indicarnos sus preferencias de idioma de documentación? Realice una breve encuesta. (tenga en cuenta que esta encuesta está en inglés)
La encuesta durará unos siete minutos. No se recopilan datos personales (declaración de privacidad).