Recently needing to provide the ability to create a N:N relationship in a workflow process provided an excuse to create a quick workflow plugin as unfortunately it isn’t currently possible to do it out-of-the-box if you have defined a relationship rather than using an intersect table.
Fortunately a plugin to do this is a very simple affair:
using Microsoft.Xrm.Sdk; using Microsoft.Xrm.Sdk.Workflow; using System; using System.Activities; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Softstuff.Workflow.Relationships { public class CreateManyToManyLink : CodeActivity { protected override void Execute(CodeActivityContext executionContext) { IWorkflowContext context = executionContext.GetExtension<IWorkflowContext>(); IOrganizationServiceFactory serviceFactory = executionContext.GetExtension<IOrganizationServiceFactory>(); IOrganizationService service = serviceFactory.CreateOrganizationService(context.InitiatingUserId); EntityReference account = Record1.Get<EntityReference>(executionContext); EntityReference new_testentity = Record2.Get<EntityReference>(executionContext); EntityReferenceCollection relatedEntities = new EntityReferenceCollection(); // Add the related entity relatedEntities.Add(account); // Add the relationship schema name Relationship relationship = new Relationship("new_account_new_testentity"); // Associate the account record to new_testentity service.Associate(new_testentity.LogicalName, new_testentity.Id, relationship, relatedEntities); } [Input("Account")] [ReferenceTarget("account")] public InArgument<EntityReference> Record1 { get; set; } [Input("New_TestEntity")] [ReferenceTarget("new_testentity")] public InArgument<EntityReference> Record2 { get; set; } } }
The plugin takes two parameters both EntityReferencetypes, and although I had hoped to be able to create a universal plugin that would work for all entities, but unfortunately you have to include the [ReferenceTarget(<entity>)] clause that limits theEntityReference to a single entity type.
For this example I have created a N:N relationship between account and new_testentity and the relationship is called new_account_new_testentity.
The lines in the plugin that actually do the work are:
relatedEntities.Add(account); // the account entityreference is added to the EntityReferenceCollection.
Relationship relationship = new Relationship(<name of the relationship>); // define the relationship
service.Associate(EntityReference,LogicalName,EntityReference.Id, relationship, relatedEntities); // actually create the link
The only other thing to remember before you compile and deploy the plugin is to sign the assembly.
Deploy the assembly using the plugin registration tool and it should appear as a custom workflow step.