テーブルリレーションシップの管理

Microsoft Dataverseのテーブル リレーションシップでは、テーブル行を他のテーブルまたは同じテーブルの行に関連付ける方法を定義します。 テーブル リレーションシップには、一対多と多対多の 2 種類があります。 次のセクションで示すように、リレーションシップ API を使用してテーブル間のリレーションシップを作成できます。

詳細情報: 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)

より単純なシナリオでは、便利な方法を使用します。

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

完全な作業例については、 例/詳細/relationships.py を参照してください。

カスケード動作を構成する

CascadeConfiguration は、一対多リレーションシップの親レコードに対してアクションを実行した場合の子レコードの動作を制御します。 次の値は、各カスケード プロパティ (assigndeletemergereparentshareunshare) に対して有効です。

価値 Behavior
"Cascade" 関連付けられているすべての子レコードに対してアクションを実行します。
"NoCascade" 子レコードにアクションを適用しないでください。
"RemoveLink" 親レコードが削除されたときに、すべての子レコードのルックアップ フィールド値を削除します。
"Restrict" 子レコードが存在する場合に親レコードが削除されないようにします。

既定では、 delete"RemoveLink" され、他のすべてのプロパティが "NoCascade"されます。 定数をインポートして、文字列値を直接使用できます。

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 戻り値オブジェクト

リレーションシップ作成メソッドは、次のフィールドを持つ RelationshipInfo オブジェクトを返します。

フィールド Description
relationship_id リレーションシップ メタデータの GUID。 この値を delete_relationshipに渡します。
relationship_schema_name リレーションシップのスキーマ名。
relationship_type "one_to_many" または "many_to_many"
lookup_schema_name 子テーブルに作成されたルックアップ フィールドのスキーマ名 (一対多のみ)。
referenced_entity / referencing_entity 親テーブルと子テーブルの論理名 (1 対多)。
entity1_logical_name / entity2_logical_name 2 つのテーブル論理名 (多対多)。

Note

多対多リレーションシップの intersect_entity_name を指定しない場合、交差テーブルではリレーションシップの schema_name がその名前として使用されます。

create_lookup_field オプション

create_lookup_field便利なメソッドは、次の省略可能なパラメーターを受け入れます。

パラメーター Default Description
display_name 参照先テーブル名 ルックアップ フィールドに表示される表示名。
description None ルックアップ フィールドの説明 (省略可能)。
required False ルックアップ フィールドが必要かどうか。
cascade_delete "RemoveLink" カスケード削除の動作: "RemoveLink""Cascade"、または "Restrict"
language_code 1033 生成されたラベルの言語コード (LCID)。
solution None リレーションシップを関連付けるソリューションの一意の名前。
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

一対多リレーションシップを削除すると、関連付けられているルックアップ フィールドも子テーブルから削除されます。 この操作は元に戻すことができません。 接続するテーブルを削除するには、リレーションシップを削除する必要があります。 list_table_relationships は、指定したテーブルが存在しない場合に MetadataError を生成します。

こちらも参照ください