public void Execute(IServiceProvider serviceProvider)
        {
            ITracingService traceService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));

            Common.WriteToTrace(traceService, "Started post status change Plugin execution");

            IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));

            IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
            IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);

            EntityReference entity = null;

            ParentEntity parentEntity = new ParentEntity();
            List<ChildEntity> lstChildEntity = new List<ChildEntity>();

            PopulateParentAndChildEntities(parentEntity, lstChildEntity, unsecureConfig);

            if (context.InputParameters.Contains(Constants.ENTITYMONIKER) && context.InputParameters[Constants.ENTITYMONIKER] is EntityReference)
            {
                entity = (EntityReference)context.InputParameters[Constants.ENTITYMONIKER];

                if (context.PrimaryEntityName.ToLower() != parentEntity.ParentEntityName.ToLower())
                {
                    Common.WriteToTrace(traceService, "Exiting the plugin, the plugin is expected to execute for " + parentEntity.ParentEntityName + " entity, not for the " + entity.LogicalName + " entity.");
                    return;
                }
            }

            else
            {
                Common.WriteToTrace(traceService, "Exiting the plugin, the plugin is expected to execute for " + parentEntity.ParentEntityName + " entity, not for the " + entity.LogicalName + " entity11.");
                return;
            }

            try
            {
                if ((context.MessageName.ToLower().Equals(Constants.SETSTATEDYNAMICENTITY) || context.MessageName.ToLower().Equals(Constants.SETSTATE)) && context.InputParameters.Contains(Constants.ENTITYMONIKER) && context.InputParameters[Constants.ENTITYMONIKER] is EntityReference)
                {
                    int status = ((OptionSetValue)context.InputParameters[Constants.STATE]).Value;

                    foreach (var childEntity in lstChildEntity)
                    {
                        EntityCollection children = RetrieveChildren(service, entity, childEntity);

                        foreach (Entity child in children.Entities)
                        {
                            var setState = new SetStateRequest();

                            setState.EntityMoniker = new EntityReference()
                            {
                                Id = child.Id,
                                LogicalName = child.LogicalName
                            };

                            if (status == parentEntity.ParentInactiveStatecode)
                            {
                                setState.State = new OptionSetValue();
                                setState.State.Value = childEntity.ChildInactiveStatecode;
                                setState.Status = new OptionSetValue();
                                setState.Status.Value = childEntity.ChildInactiveStatuscode;

                                service.Execute(setState);
                            }

                            else if (status == parentEntity.ParentActiveStatecode)
                            {
                                setState.State = new OptionSetValue();
                                setState.State.Value = childEntity.ChildActiveStatecode;
                                setState.Status = new OptionSetValue();
                                setState.Status.Value = childEntity.ChildActiveStatuscode;

                                service.Execute(setState);
                            }
                        }
                    }

                    Common.WriteToTrace(traceService, "Child records status changed successfully");
                }
                else
                {
                    Common.WriteToTrace(traceService, "Exiting the plugin, the plugin is expected to execute for " + parentEntity.ParentEntityName + " entity, not for the " + entity.LogicalName + " entityElse.");
                }
            }
            catch (Exception ex)
            {
                Common.WriteToTrace(traceService, "An exception occured: " + ex.Message);
                throw ex;
            }
        }
        private void PopulateParentAndChildEntities(ParentEntity parentEntity, List<ChildEntity> lstChildEntities, string unsecureConfig)
        {
            using (XmlReader reader = XmlReader.Create(new StringReader(unsecureConfig)))
            {
                reader.ReadToFollowing("ParentEntity");
                reader.MoveToAttribute("ParentEntityLogicalName");
                parentEntity.ParentEntityName = reader.Value;

                reader.MoveToAttribute("ParentActiveStateCode");
                parentEntity.ParentActiveStatecode = Convert.ToInt32(reader.Value);

                reader.MoveToAttribute("ParentInactiveStateCode");
                parentEntity.ParentInactiveStatecode = Convert.ToInt32(reader.Value);

                XDocument xmlDoc = XDocument.Parse(unsecureConfig);

                foreach (var childEntity in xmlDoc.Descendants("ChildEntity"))
                {
                    ChildEntity child = new ChildEntity();
                    child.ChildEntityName = childEntity.Attribute("ChildEntityLogicalName").Value;
                    child.PrimaryColumnName = childEntity.Attribute("PrimaryColumn").Value;
                    child.LookupSchemaName = childEntity.Attribute("LookupSchemaName").Value;
                    child.ChildActiveStatecode = Convert.ToInt32(childEntity.Attribute("ChildActiveStateCode").Value);
                    child.ChildInactiveStatecode = Convert.ToInt32(childEntity.Attribute("ChildInactiveStateCode").Value);
                    child.ChildActiveStatuscode = Convert.ToInt32(childEntity.Attribute("ChildActiveStatusCode").Value);
                    child.ChildInactiveStatuscode = Convert.ToInt32(childEntity.Attribute("ChildInactiveStatusCode").Value);

                    lstChildEntities.Add(child);
                };
            }
        }