エンティティ関係の作成および取得

 

公開日: 2017年1月

対象: Dynamics 365 (online)、Dynamics 365 (on-premises)、Dynamics CRM 2016、Dynamics CRM Online

このトピックでは、エンティティ関係の作成および取得方法について説明します。

このトピックの内容

1:N のエンティティ関連付けの作成

N:N のエンティティ関連付けの作成

エンティティの関連付けの取得

1:N のエンティティ関連付けの作成

次のサンプルでは、EligibleCreateOneToManyRelationship メソッドを使用して、Account および Campaign エンティティが 1:N のエンティティ関連付けに参加できることを確認し、CreateOneToManyRequest を使用してエンティティ関連付けを作成します。



bool eligibleCreateOneToManyRelationship =
    EligibleCreateOneToManyRelationship("account", "campaign");

if (eligibleCreateOneToManyRelationship)
{
    CreateOneToManyRequest createOneToManyRelationshipRequest =
        new CreateOneToManyRequest
    {
        OneToManyRelationship =
        new OneToManyRelationshipMetadata
        {
            ReferencedEntity = "account",
            ReferencingEntity = "campaign",
            SchemaName = "new_account_campaign",
            AssociatedMenuConfiguration = new AssociatedMenuConfiguration
            {
                Behavior = AssociatedMenuBehavior.UseLabel,
                Group = AssociatedMenuGroup.Details,
                Label = new Label("Account", 1033),
                Order = 10000
            },
            CascadeConfiguration = new CascadeConfiguration
            {
                Assign = CascadeType.NoCascade,
                Delete = CascadeType.RemoveLink,
                Merge = CascadeType.NoCascade,
                Reparent = CascadeType.NoCascade,
                Share = CascadeType.NoCascade,
                Unshare = CascadeType.NoCascade
            }
        },
        Lookup = new LookupAttributeMetadata
        {
            SchemaName = "new_parent_accountid",
            DisplayName = new Label("Account Lookup", 1033),
            RequiredLevel = new AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.None),
            Description = new Label("Sample Lookup", 1033)
        }
    };


    CreateOneToManyResponse createOneToManyRelationshipResponse =
        (CreateOneToManyResponse)_serviceProxy.Execute(
        createOneToManyRelationshipRequest);

    _oneToManyRelationshipId =
        createOneToManyRelationshipResponse.RelationshipId;
    _oneToManyRelationshipName = 
        createOneToManyRelationshipRequest.OneToManyRelationship.SchemaName;

    Console.WriteLine(
        "The one-to-many relationship has been created between {0} and {1}.",
        "account", "campaign");
}


Dim eligibleCreateOneToManyRelationship As Boolean =
 Me.EligibleCreateOneToManyRelationship("account", "campaign")

If eligibleCreateOneToManyRelationship Then
 Dim createOneToManyRelationshipRequest As CreateOneToManyRequest =
  New CreateOneToManyRequest With {
   .OneToManyRelationship = New OneToManyRelationshipMetadata With {
    .ReferencedEntity = "account",
    .ReferencingEntity = "campaign",
    .SchemaName = "new_account_campaign",
    .AssociatedMenuConfiguration =
    New AssociatedMenuConfiguration With {
     .Behavior = AssociatedMenuBehavior.UseLabel,
     .Group = AssociatedMenuGroup.Details,
     .Label = New Label("Account", 1033),
     .Order = 10000},
    .CascadeConfiguration =
    New CascadeConfiguration With {
     .Assign = CascadeType.Cascade,
     .Delete = CascadeType.Cascade,
     .Merge = CascadeType.Cascade,
     .Reparent = CascadeType.Cascade,
     .Share = CascadeType.Cascade,
     .Unshare = CascadeType.Cascade
    }
   },
   .Lookup = New LookupAttributeMetadata With {
    .SchemaName = "new_parent_accountid",
    .DisplayName = New Label("Account Lookup", 1033),
    .RequiredLevel = New AttributeRequiredLevelManagedProperty(AttributeRequiredLevel.None),
    .Description = New Label("Sample Lookup", 1033)
   }
  }


 Dim createOneToManyRelationshipResponse As CreateOneToManyResponse =
  CType(_serviceProxy.Execute(createOneToManyRelationshipRequest), CreateOneToManyResponse)

 _oneToManyRelationshipId = createOneToManyRelationshipResponse.RelationshipId
 _oneToManyRelationshipName = createOneToManyRelationshipRequest.OneToManyRelationship.SchemaName

 Console.WriteLine("The one-to-many relationship has been created between {0} and {1}.", "account", "campaign")
End If

EligibleCreateOneToManyRelationship

次のサンプルでは、CanBeReferencedRequest および CanBeReferencingRequest を使用する EligibleCreateOneToManyRelationship メソッドを作成して、2 つのエンティティが 1:N のエンティティ関連付けに参加できるかどうかを確認します。


/// <summary>
/// Determines whether two entities are eligible to participate in a relationship
/// </summary>
/// <param name="referencedEntity">Primary Entity</param>
/// <param name="referencingEntity">Referencing Entity</param>
/// <returns></returns>
public bool EligibleCreateOneToManyRelationship(string referencedEntity, 
    string referencingEntity)
{
    //Checks whether the specified entity can be the primary entity in one-to-many
    //relationship.
    CanBeReferencedRequest canBeReferencedRequest = new CanBeReferencedRequest
    {
        EntityName = referencedEntity
    };

    CanBeReferencedResponse canBeReferencedResponse =
        (CanBeReferencedResponse)_serviceProxy.Execute(canBeReferencedRequest);

    if (!canBeReferencedResponse.CanBeReferenced)
    {
        Console.WriteLine(
            "Entity {0} can't be the primary entity in this one-to-many relationship", 
            referencedEntity);
    }

    //Checks whether the specified entity can be the referencing entity in one-to-many
    //relationship.
    CanBeReferencingRequest canBereferencingRequest = new CanBeReferencingRequest
    {
        EntityName = referencingEntity
    };

    CanBeReferencingResponse canBeReferencingResponse =
        (CanBeReferencingResponse)_serviceProxy.Execute(canBereferencingRequest);

    if (!canBeReferencingResponse.CanBeReferencing)
    {
        Console.WriteLine(
            "Entity {0} can't be the referencing entity in this one-to-many relationship", 
            referencingEntity);
    }


    if (canBeReferencedResponse.CanBeReferenced == true
        &amp;&amp; canBeReferencingResponse.CanBeReferencing == true)
    {
        return true;
    }
    else
    {
        return false;
    }
}

''' <summary>
''' Determines whether two entities are eligible to participate in a relationship
''' </summary>
''' <param name="referencedEntity">Primary Entity</param>
''' <param name="referencingEntity">Referencing Entity</param>
''' <returns></returns>
Public Function EligibleCreateOneToManyRelationship(ByVal referencedEntity As String, ByVal referencingEntity As String) As Boolean
 'Checks whether the specified entity can be the primary entity in one-to-many
 'relationship.
 Dim canBeReferencedRequest As CanBeReferencedRequest =
  New CanBeReferencedRequest With {.EntityName = referencedEntity}

 Dim canBeReferencedResponse As CanBeReferencedResponse =
  CType(_serviceProxy.Execute(canBeReferencedRequest), CanBeReferencedResponse)

 If Not canBeReferencedResponse.CanBeReferenced Then
  Console.WriteLine("Entity {0} can't be the primary entity in this one-to-many relationship", referencedEntity)
 End If

 'Checks whether the specified entity can be the referencing entity in one-to-many
 'relationship.
 Dim canBereferencingRequest As CanBeReferencingRequest =
  New CanBeReferencingRequest With {.EntityName = referencingEntity}

 Dim canBeReferencingResponse As CanBeReferencingResponse =
  CType(_serviceProxy.Execute(canBereferencingRequest), CanBeReferencingResponse)

 If Not canBeReferencingResponse.CanBeReferencing Then
  Console.WriteLine("Entity {0} can't be the referencing entity in this one-to-many relationship", referencingEntity)
 End If


 If canBeReferencedResponse.CanBeReferenced = True AndAlso canBeReferencingResponse.CanBeReferencing = True Then
  Return True
 Else
  Return False
 End If
End Function

N:N のエンティティ関連付けの作成

次のサンプルでは、EligibleCreateManyToManyRelationship メソッドを使用して、Account および Campaign エンティティが N:N のエンティティ関連付けに参加できることを確認し、CreateManyToManyRequest を使用してエンティティ関連付けを作成します。



bool accountEligibleParticipate =
    EligibleCreateManyToManyRelationship("account");
bool campaignEligibleParticipate =
    EligibleCreateManyToManyRelationship("campaign");

if (accountEligibleParticipate &amp;&amp; campaignEligibleParticipate)
{

    CreateManyToManyRequest createManyToManyRelationshipRequest =
        new CreateManyToManyRequest
    {
        IntersectEntitySchemaName = "new_accounts_campaigns",
        ManyToManyRelationship = new ManyToManyRelationshipMetadata
        {
            SchemaName = "new_accounts_campaigns",
            Entity1LogicalName = "account",
            Entity1AssociatedMenuConfiguration =
            new AssociatedMenuConfiguration
            {
                Behavior = AssociatedMenuBehavior.UseLabel,
                Group = AssociatedMenuGroup.Details,
                Label = new Label("Account", 1033),
                Order = 10000
            },
            Entity2LogicalName = "campaign",
            Entity2AssociatedMenuConfiguration =
            new AssociatedMenuConfiguration
            {
                Behavior = AssociatedMenuBehavior.UseLabel,
                Group = AssociatedMenuGroup.Details,
                Label = new Label("Campaign", 1033),
                Order = 10000
            }
        }
    };

    CreateManyToManyResponse createManytoManyRelationshipResponse =
        (CreateManyToManyResponse)_serviceProxy.Execute(
        createManyToManyRelationshipRequest);


    _manyToManyRelationshipId =
        createManytoManyRelationshipResponse.ManyToManyRelationshipId;
    _manyToManyRelationshipName =
        createManyToManyRelationshipRequest.ManyToManyRelationship.SchemaName;

    Console.WriteLine(
        "The many-to-many relationship has been created between {0} and {1}.",
        "account", "campaign");
}


Dim accountEligibleParticipate As Boolean = EligibleCreateManyToManyRelationship("account")
Dim campaignEligibleParticipate As Boolean = EligibleCreateManyToManyRelationship("campaign")

If accountEligibleParticipate AndAlso campaignEligibleParticipate Then

 Dim createManyToManyRelationshipRequest As CreateManyToManyRequest =
  New CreateManyToManyRequest With {
   .IntersectEntitySchemaName = "new_accounts_campaigns",
   .ManyToManyRelationship = New ManyToManyRelationshipMetadata With {
    .SchemaName = "new_accounts_campaigns",
    .Entity1LogicalName = "account",
    .Entity1AssociatedMenuConfiguration =
    New AssociatedMenuConfiguration With {
     .Behavior = AssociatedMenuBehavior.UseLabel,
     .Group = AssociatedMenuGroup.Details,
     .Label = New Label("Account", 1033),
     .Order = 10000
    },
    .Entity2LogicalName = "campaign",
    .Entity2AssociatedMenuConfiguration =
    New AssociatedMenuConfiguration With {
     .Behavior = AssociatedMenuBehavior.UseLabel,
     .Group = AssociatedMenuGroup.Details,
     .Label = New Label("Campaign", 1033),
     .Order = 10000
    }
   }
  }

 Dim createManytoManyRelationshipResponse As CreateManyToManyResponse =
  CType(_serviceProxy.Execute(createManyToManyRelationshipRequest), CreateManyToManyResponse)


 _manyToManyRelationshipId = createManytoManyRelationshipResponse.ManyToManyRelationshipId
 _manyToManyRelationshipName = createManyToManyRelationshipRequest.ManyToManyRelationship.SchemaName

 Console.WriteLine("The many-to-many relationship has been created between {0} and {1}.", "account", "campaign")
End If

EligibleCreateManyToManyRelationship

次のサンプルでは、CanManyToManyRequest を使用する EligibleCreateManyToManyRelationship メソッドを作成して、任意のエンティティが N:N のエンティティ関連付けに参加できるかどうかを確認します。


/// <summary>
/// Determines whether the entity can participate in a many-to-many relationship.
/// </summary>
/// <param name="entity">Entity</param>
/// <returns></returns>
public bool EligibleCreateManyToManyRelationship(string entity)
{
    CanManyToManyRequest canManyToManyRequest = new CanManyToManyRequest
    {
        EntityName = entity
    };

    CanManyToManyResponse canManyToManyResponse =
        (CanManyToManyResponse)_serviceProxy.Execute(canManyToManyRequest);

    if (!canManyToManyResponse.CanManyToMany)
    {
        Console.WriteLine(
            "Entity {0} can't participate in a many-to-many relationship.", 
            entity);
    }

    return canManyToManyResponse.CanManyToMany;
}

''' <summary>
''' Determines whether the entity can participate in a many-to-many relationship.
''' </summary>
''' <param name="entity">Entity</param>
''' <returns></returns>
Public Function EligibleCreateManyToManyRelationship(ByVal entity As String) As Boolean
 Dim canManyToManyRequest As CanManyToManyRequest =
  New CanManyToManyRequest With {.EntityName = entity}

 Dim canManyToManyResponse As CanManyToManyResponse =
  CType(_serviceProxy.Execute(canManyToManyRequest), CanManyToManyResponse)

 If Not canManyToManyResponse.CanManyToMany Then
  Console.WriteLine("Entity {0} can't participate in a many-to-many relationship.", entity)
 End If

 Return canManyToManyResponse.CanManyToMany
End Function

エンティティの関連付けの取得

次のサンプルでは、RetrieveRelationshipRequest を使用して前に作成した 2 つのエンティティ関連付けを取得します。 最初の例では MetadataId を使用し、2 番目の例では Name を使用します。



//You can use either the Name or the MetadataId of the relationship.

//Retrieve the One-to-many relationship using the MetadataId.
RetrieveRelationshipRequest retrieveOneToManyRequest =
    new RetrieveRelationshipRequest { MetadataId = _oneToManyRelationshipId };
RetrieveRelationshipResponse retrieveOneToManyResponse =
    (RetrieveRelationshipResponse)_serviceProxy.Execute(retrieveOneToManyRequest);

Console.WriteLine("Retrieved {0} One-to-many relationship by id", retrieveOneToManyResponse.RelationshipMetadata.SchemaName);

//Retrieve the Many-to-many relationship using the Name.
RetrieveRelationshipRequest retrieveManyToManyRequest =
    new RetrieveRelationshipRequest { Name = _manyToManyRelationshipName};
RetrieveRelationshipResponse retrieveManyToManyResponse =
    (RetrieveRelationshipResponse)_serviceProxy.Execute(retrieveManyToManyRequest);

Console.WriteLine("Retrieved {0} Many-to-Many relationship by Name", retrieveManyToManyResponse.RelationshipMetadata.MetadataId);


'You can use either the Name or the MetadataId of the relationship.

'Retrieve the One-to-many relationship using the MetadataId.
Dim retrieveOneToManyRequest As RetrieveRelationshipRequest =
 New RetrieveRelationshipRequest With {.MetadataId = _oneToManyRelationshipId}
Dim retrieveOneToManyResponse As RetrieveRelationshipResponse =
 CType(_serviceProxy.Execute(retrieveOneToManyRequest), RetrieveRelationshipResponse)

Console.WriteLine("Retrieved {0} One-to-many relationship by id",
                  retrieveOneToManyResponse.RelationshipMetadata.SchemaName)

'Retrieve the Many-to-many relationship using the Name.
Dim retrieveManyToManyRequest As RetrieveRelationshipRequest =
 New RetrieveRelationshipRequest With {
  .Name = _manyToManyRelationshipName
 }
Dim retrieveManyToManyResponse As RetrieveRelationshipResponse =
 CType(_serviceProxy.Execute(retrieveManyToManyRequest), RetrieveRelationshipResponse)

Console.WriteLine("Retrieved {0} Many-to-Many relationship by Name",
                  retrieveManyToManyResponse.RelationshipMetadata.MetadataId)

関連項目

エンティティ関係メタデータをカスタマイズする
エンティティの関連付けのメタデータ メッセージ
サンプル: エンティティ関係の作成および取得

Microsoft Dynamics 365

© 2017 Microsoft. All rights reserved. 著作権