Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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.