Partager via


Create and retrieve entity relationships

 

Applies To: Dynamics CRM 2013

This topic shows how to create and retrieve entity relationships.

In This Topic

Create a 1:N entity relationship

Create an N:N entity relationship

Retrieve entity relationships

Create a 1:N entity relationship

The following sample uses the EligibleCreateOneToManyRelationship method to verify that the Account and Campaign entities can participate in a 1:N entity relationship and then creates the entity relationship by using 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.NoCascade,
     .Delete = CascadeType.RemoveLink,
     .Merge = CascadeType.NoCascade,
     .Reparent = CascadeType.NoCascade,
     .Share = CascadeType.NoCascade,
     .Unshare = CascadeType.NoCascade
    }
   },
   .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

The following sample creates a EligibleCreateOneToManyRelationship method that uses CanBeReferencedRequest and CanBeReferencingRequest to verify whether two entities can participate in a 1:N entity relationship.


/// <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

Create an N:N entity relationship

The following sample uses a EligibleCreateManyToManyRelationship method to verify that the Account and Campaign entities can participate in a N:N entity relationship and then creates the entity relationship by using 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

The following sample creates a EligibleCreateManyToManyRelationship method that uses CanManyToManyRequest to verify whether an entity can participate in a N:N entity relationship.


/// <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

Retrieve entity relationships

The following sample retrieves the two entity relationships previously created using RetrieveRelationshipRequest. The first example uses the MetadataId and the second uses the 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)

See Also

Customize entity relationship metadata
Entity relationship metadata messages
Sample: Create and retrieve entity relationships