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 は、一対多リレーションシップの親レコードに対してアクションを実行した場合の子レコードの動作を制御します。 次の値は、各カスケード プロパティ (assign、 delete、 merge、 reparent、 share、 unshare) に対して有効です。
| 価値 | 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 を生成します。