If we have a task/update/query which needs to run for longer time i.e. more than 2 min we can create a custom workflow activity and that will run asynchronously in the background and user of CRM can continue working on other stuff.
Why do we need this?
For example if you have a plugin which runs and adds some records and on the basis of that you need to run something for longer period then we can add entity id’s to our workflow entity by calling CRM Api and on any insert into Workflow entity this workflow will get fired and will run in the background and will not affect plugin
For example whenever a new match gets created and then assigned to a series, it will create record for each customer who has membership of that series and customer will get a ticket for that series and system will try to insert a new record. So let’s say we had 40000 members then system will generate 40000 extra rows for data table and obviously some other tables/entities will require insert/update too.
We cannot use plugins for this and even trying Plugin asynchronously would not work and Workflow Activity instead might do the job
First need to create a new project in your solution
Templates > Visual C#> Dynamics CRM > Dynamics CRM 2011 Workflow Library and give it a name “WorkflowActivityTest”
Enter server details if you are deploying to a server
Below is how it should look at the start
Now we need to create Strong Name Key for project
Right click on the project> Signing> Tick sign in assembly >give it a name abc
Now we need to add a CRM Package to our solution
Right click on solution and add a new CRM package
Next step is to add activity class to our WorkflowActivityTest project
Then right click on the project and add> Dynamics CRM> Workflow Activity Class> Give it a name “FixtureToSeries”
This will ask for few details with a form popping up like below
Friendly name: Any name (Fixture To Series)
Name: Any name (FixtureToSeries)
WorkflowActivityGroupName: This is Singing name you created or you give it name something like abc and then later you can create it(Go to Project properties> Signing> Choose a strong name key file> New> Give it a name
Make sure we have all missing references and using statements
Now we need to create arguments which will be added later from CRM or any external source i.e. plugin etc.
In our case above, we will need fixture (event), series(category) and type (attaching or detaching ). These can be of any type we need i.e. string etc.
Now add all the code you need to (all logic)
Below is an example how to get data
string primaryEntityName = context.PrimaryEntityName; //our primary entity name
Guid primaryEntityId = context.PrimaryEntityId; // entity id
string type = this.Type.Get(executionContext); //is it association or dissociation
EntityReference fixtureEntity = this.Fixture.Get(executionContext); //event/fixture entity
EntityReference seriesEntity = this.Series.Get(executionContext); //category/series entity
////fixture Id and Series Id
Guid fixtureId = fixtureEntity.Id;
Guid seriesId = seriesEntity.Id;
Now we have passed in values and we can do what we need.
Once you have written all your logic then need to compile and deploy this to your solution
This will deploy your activity into your solution in CRM (make sure you have administrator rights on CRM and it is UMMANAGED solution)
Once we have both entities and our string parameter value we can carry on without work i.e. call method which does long update/insert data.
To link this Workflow Activity to an entity we need to go to CRM to add a new Workflow. We can also do this through Visual Studio too.
Once created we need to add steps to it
First step is to add our custom activity Workflow to it as similar to the one shown below
Then click on properties and add input values
For each input we get option to select a main entity i.e. Workflow Queue and then associated entities
Now activate workflow and we are all set to go.
This workflow will be called whenever any insert is done into Workflow Queue Entity.