Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
As relações de tabela no Microsoft Dataverse definem como as linhas de tabela podem ser associadas a linhas de outras tabelas ou da mesma tabela. Há dois tipos de relacionamentos entre tabelas: um-para-muitos e muitos-para-muitos. Você pode criar relações entre tabelas usando as APIs de relação, conforme demonstrado na seção a seguir.
Mais informações: Relações de tabela do 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 cenários mais simples, use o método de conveniência.
# 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 obter um exemplo de trabalho completo, consulte exemplos/advanced/relationships.py.
Configurar o comportamento em cascata
CascadeConfiguration controla o que acontece com os registros filho quando você executa uma ação no registro pai em um relacionamento um-para-muitos. Os valores a seguir são válidos para cada propriedade em cascata (assign, , delete, merge, reparent, share, unshare).
| Value | Behavior |
|---|---|
"Cascade" |
Execute a ação em todos os registros filho associados. |
"NoCascade" |
Não aplique a ação a nenhum registro filho. |
"RemoveLink" |
Remova o valor do campo de referência em todos os registros filhos quando o registro pai for excluído. |
"Restrict" |
Impedir que o registro pai seja excluído quando houver registros filho. |
Por padrão, delete é "RemoveLink" e todas as outras propriedades são "NoCascade". Você pode importar as constantes para usar os valores de cadeia de caracteres diretamente.
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
Os métodos de criação de relação retornam um RelationshipInfo objeto com os campos a seguir.
| Campo | Description |
|---|---|
relationship_id |
GUID dos metadados do relacionamento. Passe esse valor para delete_relationship. |
relationship_schema_name |
Nome do esquema da relação. |
relationship_type |
"one_to_many" ou "many_to_many". |
lookup_schema_name |
Nome do esquema do campo de referência criado na tabela filha (somente um-para-muitos). |
referenced_entity / referencing_entity |
Nomes lógicos da tabela pai e da tabela filho (um-para-muitos). |
entity1_logical_name / entity2_logical_name |
Os dois nomes lógicos das tabelas (muitos para muitos). |
Note
Se você não fornecer um(a) intersect_entity_name para uma relação muitos-para-muitos, a tabela de interseção usará o(a) schema_name da relação como nome.
opções de create_lookup_field
O create_lookup_field método de conveniência aceita os seguintes parâmetros opcionais.
| Parâmetro | Padrão | Description |
|---|---|---|
display_name |
Nome da tabela referenciada | Nome de exibição exibido para o campo de pesquisa. |
description |
None |
Descrição opcional para o campo de pesquisa. |
required |
False |
Indica se o campo de pesquisa é obrigatório. |
cascade_delete |
"RemoveLink" |
Excluir comportamento em cascata: "RemoveLink", "Cascade"ou "Restrict". |
language_code |
1033 |
Código de linguagem (LCID) para rótulos gerados. |
solution |
None |
Nome exclusivo da solução à qual associar a relação. |
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
Excluir uma relação um-para-muitos também remove o campo de pesquisa associado da tabela filho. Essa operação é irreversível. Você deve excluir os relacionamentos antes de excluir as tabelas que eles conectam.
list_table_relationships gerará um MetadataError se a tabela especificada não existir.