Bulk Operations en D365 CE (Dataverse): guía técnica con operativa, decisiones y ejemplos
Artículo de conocimiento · 21 dic 2025
- Origen
- Estado
- Publicado
Contenido
Cuándo usar CreateMultiple, UpdateMultiple, UpsertMultiple, ExecuteMultiple, $batch o BulkDelete, y cómo diseñar lotes, paralelismo, reintentos e idempotencia.
Resumen del artículo publicado en LinkedIn. El enlace “Ver original” lleva al texto completo, con ejemplos de Web API y SDK .NET.
El problema
Migraciones, integraciones, reprocesados y limpiezas acaban siendo operaciones masivas en Dataverse. Con un Create/Update por registro llegan la latencia, los límites de protección del servicio, los timeouts y las tormentas de trabajos asíncronos.
Qué usar en cada caso
- CreateMultiple / UpdateMultiple / UpsertMultiple: el mayor rendimiento para muchas filas del mismo tipo. En tablas estándar son transaccionales (si falla una, se revierte todo); en tablas elásticas admiten éxito parcial.
- ExecuteMultiple: mezcla operaciones y tipos, cada petición en su propia transacción. Ideal si esperas cierto porcentaje de fallos.
- $batch de la Web API: si ya trabajas en HTTP puro.
- BulkDelete: borrado masivo asíncrono en tablas estándar (retención, RGPD, limpiezas).
Cómo diseñarlo sin sorpresas
- Comprueba que la tabla admite los mensajes Multiple y ten un plan B.
- Tamaño de lote configurable (100–1000 en estándar, 100 en elásticas): empieza conservador y mide.
- Respeta el grado de paralelismo recomendado que devuelve Dataverse y desactiva la afinidad de servidor.
- Reintentos con backoff ante 429 y 5xx, con logs por lote.
- Decide si ejecutas la lógica de negocio o la omites con
BypassBusinessLogicExecution(requiere privilegio). - Idempotencia con UpsertMultiple y claves alternativas.
La regla de oro
Las operaciones masivas se lanzan desde fuera (integraciones, Azure Functions…), nunca desde un plug-in. Los plug-ins deben ser ligeros y, si reciben mensajes Multiple, procesar la colección Targets.
General
- Publicado
- 21 dic 2025
- Origen
- Palabras clave
- RendimientoDataversePlugins.NET / C#