private void CreateMessageProcessingStepImage(
            IOrganizationService service,
            ITracingService tracer,
            Guid stepId,
            string imageName,
            CrmData.SdkImageType imageType,
            CrmData.SdkMessageName messageName,
            string attributes)
        {
            var existingImages = GetStepImageReferences(service, stepId, imageName, imageType);

            if (existingImages.Any())
            {
                tracer.Trace("A step image named '{0}' of type '{1}' already exists.", imageName, imageType.ToString());
            }
            else
            {
                var image = new Entity(CrmData.SdkMessageProcessingStepImageEntityName);
                image[CrmData.SdkMessageProcessingStepImage_SdkMessageProcessingStepId] = new EntityReference(CrmData.SdkMessageProccessingStepEntityName, stepId);
                image[CrmData.SdkMessageProcessingStepImage_Name]                = imageName;
                image[CrmData.SdkMessageProcessingStepImage_EntityAlias]         = imageName;
                image[CrmData.SdkMessageProcessingStepImage_ImageType]           = new OptionSetValue((int)imageType);
                image[CrmData.SdkMessageProcessingStepImage_MessagePropertyName] = CrmData.GetMessageProperyName(messageName);

                if (!string.IsNullOrEmpty(attributes))
                {
                    image[CrmData.SdkMessageProcessingStepImage_Attributes] = attributes;
                }

                service.Create(image);
            }
        }
        private IEnumerable <EntityReference> GetStepReferences(
            IOrganizationService service,
            string entityLogicalName,
            CrmData.SdkMessageName messageName,
            string assemblyName,
            string pluginName)
        {
            var messageReference = GetMessageReference(service, messageName);

            // Find message processing steps
            var query = new QueryExpression
            {
                EntityName = CrmData.SdkMessageProccessingStepEntityName,
                ColumnSet  = new ColumnSet(CrmData.SdkMessageProccessingStep_Id)
            };

            // That are for the Number Generator plugin
            query.Criteria.AddCondition(
                CrmData.SdkMessageProccessingStep_PluginTypeId,
                ConditionOperator.Equal,
                GetPluginTypeReference(service, assemblyName, pluginName).Id);

            // And of the correct message type
            query.Criteria.AddCondition(
                CrmData.SdkMessageProccessingStep_SdkMessageId,
                ConditionOperator.Equal,
                messageReference.Id);

            // With a message filter
            var messageFilterLink = query.AddLink(
                CrmData.SdkMessageFilterEntityName,
                CrmData.SdkMessageProccessingStep_SdkMessageFilterId,
                CrmData.SdkMessageFilter_Id);

            // That is for a create message
            messageFilterLink.LinkCriteria.AddCondition(
                CrmData.SdkMessageFilter_SdkMessageId,
                ConditionOperator.Equal,
                messageReference.Id);

            // And to our entity
            messageFilterLink.LinkCriteria.AddCondition(
                CrmData.SdkMessageFilter_PrimaryObjectTypeCode,
                ConditionOperator.Equal,
                entityLogicalName);

            var steps = service.RetrieveMultiple(query);

            return(steps.Entities.Select(e => e.ToEntityReference()));
        }
        private void DeleteMessageProcessingSteps(
            IOrganizationService service,
            string entityLogicalName,
            CrmData.SdkMessageName messageName,
            string assemblyName,
            string pluginName)
        {
            var existingSteps = GetStepReferences(service, entityLogicalName, messageName, assemblyName, pluginName);

            foreach (var step in existingSteps)
            {
                service.Delete(CrmData.SdkMessageProccessingStepEntityName, step.Id);
            }
        }
        private EntityReference GetMessageReference(IOrganizationService service, CrmData.SdkMessageName messageName)
        {
            var query = new QueryExpression
            {
                EntityName = CrmData.SdkMessageEntityName,
                ColumnSet  = new ColumnSet(CrmData.SdkMessage_Id)
            };

            query.Criteria.AddCondition(
                CrmData.SdkMessage_Name,
                ConditionOperator.Equal,
                messageName.ToString());

            var sdkMessages = service.RetrieveMultiple(query);
            var sdkMessage  = sdkMessages.Entities.First();

            return(sdkMessage.ToEntityReference());
        }
        private Guid CreateMessageProcessingtStep(
            IOrganizationService service,
            ITracingService tracer,
            string entityLogicalName,
            CrmData.SdkMessageName messageName,
            IEnumerable <string> attributeNames,
            string assemblyName,
            string pluginName)
        {
            var messageReference = GetMessageReference(service, messageName);
            var existingSteps    = GetStepReferences(service, entityLogicalName, messageName, assemblyName, pluginName);

            if (existingSteps.Any())
            {
                tracer.Trace("A '{0}' step already exists for entity [{1}].", messageName.ToString(), entityLogicalName);
                return(existingSteps.First().Id);
            }
            else
            {
                tracer.Trace("Creating a '{0}' step for the entity [{1}].", messageName.ToString(), entityLogicalName);

                // Register a "create" step under the Number Generator plugin for the requested entity type
                var step = new Entity(CrmData.SdkMessageProccessingStepEntityName);
                step[CrmData.SdkMessageProccessingStep_Name]                = string.Format("{0}: {1} of {2}", pluginName, messageName, entityLogicalName);
                step[CrmData.SdkMessageProccessingStep_Mode]                = new OptionSetValue((int)CrmData.CrmPluginStepMode.Synchronous);
                step[CrmData.SdkMessageProccessingStep_PluginTypeId]        = GetPluginTypeReference(service, assemblyName, pluginName);
                step[CrmData.SdkMessageProccessingStep_Rank]                = 1;
                step[CrmData.SdkMessageProccessingStep_SdkMessageId]        = messageReference;
                step[CrmData.SdkMessageProccessingStep_Stage]               = new OptionSetValue((int)CrmData.CrmPluginStepStage.PreOperation);
                step[CrmData.SdkMessageProccessingStep_SupportedDeployment] = new OptionSetValue((int)CrmData.CrmPluginStepDeployment.ServerOnly);
                step[CrmData.SdkMessageProccessingStep_SdkMessageFilterId]  = GetMessageFilterReference(service, messageReference, entityLogicalName);

                if (attributeNames != null && attributeNames.Any())
                {
                    step[CrmData.SdkMessageProccessingStep_FilteringAttributes] = String.Join(",", attributeNames);
                }

                var stepId = service.Create(step);
                return(stepId);
            }
        }