Verwalten von Tabellenbeziehungen

Tabellenbeziehungen in Microsoft Dataverse definieren, wie Tabellenzeilen Zeilen aus anderen Tabellen oder derselben Tabelle zugeordnet werden können. Es gibt zwei Arten von Tabellenbeziehungen: 1:n und n:n. Sie können Beziehungen zwischen Tabellen erstellen, indem Sie die Beziehungs-APIs verwenden, wie im folgenden Abschnitt gezeigt.

Weitere Informationen: Microsoft Dataverse Tabellenbeziehungen

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)

Verwenden Sie für einfachere Szenarien die Komfortmethode.

# 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",
)

Ein vollständiges Arbeitsbeispiel finden Sie unter Beispiele/erweitert/relationships.py.

Konfigurieren des Kaskadenverhaltens

CascadeConfiguration steuert, was mit untergeordneten Datensätzen geschieht, wenn Sie eine Aktion für den übergeordneten Datensatz in einer 1:n-Beziehung ausführen. Die folgenden Werte sind für jede Cascade-Eigenschaft gültig (assign, , , reparentmerge, , ). unsharesharedelete

Wert Behavior
"Cascade" Führen Sie die Aktion für alle zugehörigen untergeordneten Datensätze aus.
"NoCascade" Wenden Sie die Aktion nicht auf untergeordnete Datensätze an.
"RemoveLink" Entfernen Sie den Wert des Lookup-Felds in allen untergeordneten Datensätzen, wenn der übergeordnete Datensatz gelöscht wird.
"Restrict" Verhindern, dass der übergeordnete Datensatz gelöscht wird, wenn untergeordnete Datensätze vorhanden sind.

Standardmäßig ist delete"RemoveLink" und alle anderen Eigenschaften sind "NoCascade". Sie können die Konstanten importieren, um die Zeichenfolgenwerte direkt zu verwenden.

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),
)

RelationshipInfo-Rückgabeobjekt

Die Methoden für die Beziehungserstellung geben ein RelationshipInfo Objekt mit den folgenden Feldern zurück.

Feld Description
relationship_id GUID der Beziehungsmetadaten. Übergeben Sie diesen Wert an delete_relationship.
relationship_schema_name Schemasname der Beziehung.
relationship_type "one_to_many" oder "many_to_many".
lookup_schema_name Schemaname des Nachschlagefelds, das in der untergeordneten Tabelle erstellt wurde (nur bei 1:n-Beziehungen).
referenced_entity / referencing_entity Logische Namen der übergeordneten und untergeordneten Tabellen (1:n).
entity1_logical_name / entity2_logical_name Die beiden logischen Tabellennamen (Viele-zu-viele).

Note

Wenn Sie für eine n:n-Beziehung kein intersect_entity_name angeben, verwendet die Zwischentabelle den schema_name der Beziehung als Namen.

create_lookup_field-Optionen

Die create_lookup_field Komfortmethode akzeptiert die folgenden optionalen Parameter.

Parameter Vorgabe Description
display_name Name der referenzierten Tabelle Anzeigename, der für das Lookup-Feld angezeigt wird.
description None Optionale Beschreibung für das Nachschlagefeld.
required False Gibt an, ob das Nachschlagefeld erforderlich ist.
cascade_delete "RemoveLink" Kaskadenlöschverhalten: "RemoveLink", "Cascade", oder "Restrict".
language_code 1033 Sprachcode (LCID) für generierte Bezeichnungen.
solution None Eindeutiger Name der Lösung, mit der die Beziehung verknüpft wird.
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",
)

Important

Beim Löschen einer Eins-zu-viele-Beziehung wird auch das zugeordnete Lookup-Feld aus der untergeordneten Tabelle entfernt. Dieser Vorgang kann nicht rückgängig gemacht werden. Sie müssen Beziehungen löschen, bevor Sie die Tabellen löschen können, die sie verbinden. list_table_relationships löst ein MetadataError aus, wenn die angegebene Tabelle nicht vorhanden ist.

Siehe auch