Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Programmatically creating LookupAttributeMetadata in Dynamics CRM 2015

I am about to migrate a Dynamics CRM 2011 On Premise instance to Dynamics CRM 2015 Online.

I'm using the current Dynamics CRM SDK (current Version 7.1) and have managed to migrate the custom attributes, except the Virtual and Lookup ones, which can't be created via CreateAttributeRequest.

Now next, I need to migrate all the relationships. So far I've been able to get the necessary OneToManyRelationshipMetadata and ManyToManyRelationshipMetadata. However, for OneToManyRelationshipMetadata I need to pass a LookupAttributeMetadata to the CreateAttributeRequest.

OneToManyRelationshipRequest request = new OneToManyRelationshipRequest() 
{
    Lookup = new LookupAttributeMetadata() 
    {
        SchemaName = "new_topicid",
        DisplayName = new Label("Subject", 1033),
        Description = new Label("Subject Description", 1033)
    },
    OneToManyRelationship = new OneToManyRelationshipMetadata() 
    {
        ReferencedEntity = "subject",
        ReferencedAttribute = "subjectid",
        ReferencingEntity = "customer",
        ReferencingAttribute = "new_topicid"
    }
}

However, I get the exception that attribute new_topicid doesn't exist. That may make sense, since I had to skip it during Attribute creation earlier (since it can't be created through CreateAttributeRequest).

Is there any other way how I can migrate the LookupAttributeMetadata or OneToManyRelationshipMetadata/ManyToManyRelationshipMetadata to Dynamics CRM online?

like image 210
Tseng Avatar asked Oct 24 '25 08:10

Tseng


2 Answers

There is a sample on the MSDN for this.

The sample has significantly more parameters than your code above which is probably the cause of the problem.

Sample: Create and retrieve entity relationships

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)
    }
};
like image 165
James Wood Avatar answered Oct 25 '25 20:10

James Wood


Why is the Dynamics community so quick to tell people they should not be doing something? There may be a good reason right? The answer is in the CRM 2015 SDK. Look for a class called WorkWithRelationships.cs.

Here it is anyway for posterity.

var 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)
    }
};

var createOneToManyRelationshipResponse = (CreateOneToManyResponse)_serviceProxy.Execute(
createOneToManyRelationshipRequest);
like image 26
Trujllo Avatar answered Oct 25 '25 21:10

Trujllo