Oharra
Baimena behar duzu orria atzitzeko. Direktorioetan saioa has dezakezu edo haiek alda ditzakezu.
Baimena behar duzu orria atzitzeko. Direktorioak alda ditzakezu.
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 devolución 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 secundaria (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 varios a varios, 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.