Administrar relaciones de tabla

Las relaciones de tabla en Microsoft Dataverse definen cómo se pueden asociar las filas de tabla a filas de otras tablas o a la misma tabla. Hay dos tipos de relaciones de tabla: uno a varios y varios a varios. Puede crear relaciones entre tablas mediante las API de relación, como se muestra en la sección siguiente.

Más información: Relaciones entre tablas de Microsoft Dataverse

from PowerPlatform.Dataverse.models import (
    CascadeConfiguration,
    Label,
    LocalizedLabel,
    LookupAttributeMetadata,
    ManyToManyRelationshipMetadata,
    OneToManyRelationshipMetadata,
)

# Create a one-to-many relationship: Department (1) -> Employee (N)
# This adds a "Department" lookup field to the Employee table
lookup = LookupAttributeMetadata(
    schema_name="new_DepartmentId",
    display_name=Label(localized_labels=[LocalizedLabel(label="Department", language_code=1033)]),
)

relationship = OneToManyRelationshipMetadata(
    schema_name="new_Department_Employee",
    referenced_entity="new_department",   # Parent table (the "one" side)
    referencing_entity="new_employee",    # Child table (the "many" side)
    referenced_attribute="new_departmentid",
)

result = client.tables.create_one_to_many_relationship(lookup, relationship)
print(f"Created lookup field: {result.lookup_schema_name}")

# Create a many-to-many relationship: Employee (N) <-> Project (N)
# Employees work on multiple projects; projects have multiple team members
m2m_relationship = ManyToManyRelationshipMetadata(
    schema_name="new_employee_project",
    entity1_logical_name="new_employee",
    entity2_logical_name="new_project",
)

result = client.tables.create_many_to_many_relationship(m2m_relationship)
print(f"Created M:N relationship: {result.relationship_schema_name}")

# Query relationship metadata
rel = client.tables.get_relationship("new_Department_Employee")
if rel:
    print(f"Found: {rel.relationship_schema_name}")

# List all relationships
rels = client.tables.list_relationships()
for rel in rels:
    print(f"{rel['SchemaName']} ({rel.get('RelationshipType')})")

# List relationships for a specific table (one-to-many + many-to-one + many-to-many)
account_rels = client.tables.list_table_relationships("account")
for rel in account_rels:
    print(f"{rel['SchemaName']} -> {rel.get('RelationshipType')}")

# Delete a relationship
client.tables.delete_relationship(result.relationship_id)

Para escenarios más sencillos, use el método de conveniencia.

# Quick way to create a lookup field with sensible defaults
result = client.tables.create_lookup_field(
    referencing_table="contact",       # Child table gets the lookup field
    lookup_field_name="new_AccountId",
    referenced_table="account",        # Parent table being referenced
    display_name="Account",
)

Para ver un ejemplo completo y funcional, consulte examples/advanced/relationships.py.

Configuración del comportamiento en cascada

CascadeConfiguration controla lo que sucede con los registros secundarios cuando realizas una acción en el registro principal en una relación de uno a varios. Los valores siguientes son válidos para cada propiedad en cascada (assign, delete, reparentmerge, , share, unshare).

Value Comportamiento
"Cascade" Realice la acción en todos los registros secundarios asociados.
"NoCascade" No aplique la acción a ningún registro secundario.
"RemoveLink" Borre el valor del campo de referencia en todos los registros secundarios cuando se elimine el registro principal.
"Restrict" Impedir que el registro primario se elimine cuando existen registros secundarios.

De forma predeterminada, delete es "RemoveLink" y todas las demás propiedades son "NoCascade". Puede importar las constantes para usar los valores de cadena directamente.

from PowerPlatform.Dataverse.common.constants import (
    CASCADE_BEHAVIOR_CASCADE,
    CASCADE_BEHAVIOR_NO_CASCADE,
    CASCADE_BEHAVIOR_REMOVE_LINK,
    CASCADE_BEHAVIOR_RESTRICT,
)

relationship = OneToManyRelationshipMetadata(
    schema_name="new_Department_Employee",
    referenced_entity="new_department",
    referencing_entity="new_employee",
    referenced_attribute="new_departmentid",
    cascade_configuration=CascadeConfiguration(delete=CASCADE_BEHAVIOR_REMOVE_LINK),
)

objeto de retorno RelationshipInfo

Los métodos de creación de relaciones devuelven un RelationshipInfo objeto con los campos siguientes.

Campo Description
relationship_id GUID de los metadatos de la relación. Pase este valor a delete_relationship.
relationship_schema_name Nombre de esquema de la relación.
relationship_type "one_to_many" o "many_to_many".
lookup_schema_name Nombre de esquema del campo de búsqueda creado en la tabla hija (solo para relaciones de uno a varios).
referenced_entity / referencing_entity Nombres lógicos de tabla principal y secundario (uno a varios).
entity1_logical_name / entity2_logical_name Los dos nombres lógicos de las tablas (de varios a varios).

Note

Si no especifica un intersect_entity_name para una relación muchos a muchos, la tabla de intersección usa el schema_name de la relación como nombre.

opciones de create_lookup_field

El create_lookup_field método de conveniencia acepta los siguientes parámetros opcionales.

Parámetro Predeterminado Description
display_name Nombre de tabla al que se hace referencia Nombre para mostrar del campo de búsqueda.
description None Descripción opcional del campo de búsqueda.
required False Indica si se requiere el campo de búsqueda.
cascade_delete "RemoveLink" Elimine el comportamiento en cascada: "RemoveLink", "Cascade"o "Restrict".
language_code 1033 Código de lenguaje (LCID) para etiquetas generadas.
solution None Nombre único de la solución con el que asociar la relación.
result = client.tables.create_lookup_field(
    referencing_table="new_order",
    lookup_field_name="new_AccountId",
    referenced_table="account",
    display_name="Account",
    required=True,
    cascade_delete="RemoveLink",
)

Importante

Al eliminar una relación de uno a varios, también se elimina el campo de búsqueda asociado de la tabla secundaria. Esta operación es irreversible. Debe eliminar las relaciones antes de poder eliminar las tablas que se conectan. list_table_relationships genera un MetadataError si la tabla especificada no existe.

Véase también