¿Sabes de esos errores que te quiebran la cabeza durante un rato, esos que no les encuentras lógica porque tienes todo correctamente hecho? Y se pone peor aún cuando descubres la solución y resulta ser simple y rápida de implementar... Pues quédate por aquí que te cuento la última situación que he tenido de estas, y de paso, al final de la lectura, sabrás evitar este problema rápidamente.
Conociendo el problema
El caso en cuestión ocurrió durante la carga de registros a la tabla Cuentas en Dataverse usando un pipeline en Azure Synapse Analytics (también aplicable en Azure Data Factory). Todo parecía estar configurado correctamente, pero al realizar la operación upsert, me encontré con este error:
| “Cannot find the target column for multi-target lookup field: 'ownerid'”
El error se debe a que el campo propietario (ownerid) puede relacionarse tanto con la tabla Usuario como con Equipo. Aunque configuré el mapeo para indicar que el valor provenía de un usuario (owneridtype = "Usuario"), el proceso seguía fallando porque Dataverse no podía resolver la relación de forma automática.
Como se muestra en la Imagen 1, el mapeo inicial parecía correcto, pero no era suficiente. Después de muchas pruebas y búsquedas, descubrí que el problema radicaba en cómo Dataverse requiere que los campos multi-target lookup estén configurados. No basta con especificar el tipo de entidad (owneridtype); es necesario usar el formato correcto para el campo en el destino, lo cual explicaré en la próxima sección.

En definitiva, Dataverse requiere de información adicional que indique a qué entidad pertenece el ID especificado con el mapeo de ownerid. Sin embargo, por mucho que pueda parecer que la solución pasa por añadir el owneridtype, no es el camino correcto.
Modificando el JSON para establecer EntityReference en el mapeo
Para solucionar el problema descrito, estando en la herramienta de diseño del pipeline, hay que acceder a la vista en formato JSON que ofrecen las herramientas de Azure.

Tras pulsar en el botón que permite visualizar el JSON del pipeline y buscar la zona del mapeo del campo propietario, se puede observar la representación en código de lo que se presentó en la Imagen 1.

Llegados a este punto, la única modificación a realizar para dar cuenta del error descrito es la de cambiar el mapeo del owneridtype para que en el destino (sink) sea ownerid@EntityReference en vez de la ya mencionada expresión owneridtype. Por tanto, el mapeo debe establecerse como se muestra en la Imagen 4:

Conclusión
Por último, resaltar que más allá del campo propietario, esta es la forma correcta de mapear cualquier campo multi-target lookup que se necesite importar hasta Dataverse. Una vez que se ejecuta de nuevo el flujo, todo va como la seda.
Espero que este artículo te sea de ayuda y que te ahorre todo el tiempo que yo tuve que invertir en dar con la solución, que tal y como dije al comienzo, es rápida y sencilla de implementar.
De igual forma, si te has enfrentado a un problema similar o te vendría bien alguna aclaración, no dudes en hacérmelo saber.
¡Hasta la próxima!
Comments