Разработка
02
Сен
2

Автоматически публикация Правил обнаружения дубликатов

При импорте управляемого или неуправляемого Решения в CRM 2011 если при этом менялись какие-либо метаданные объекта все Правила поиска дубликатов, связанные с объектом, автоматически деактивируются. Администраторы могут забывать об этом и тогда Правила не будут срабатывать в нужное время.

Чтобы избежать этого, можно создать такой плагин и зарегистрировать его на сообщение Publish All (асинхронно):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ServiceModel;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
using Microsoft.Xrm.Sdk.Messages;
using Microsoft.Crm.Sdk.Messages;

namespace PublishRules
{
    public class PublishRules : IPlugin
    {
        public void Execute(IServiceProvider serviceProvider)
        {
            IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));

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

                // Запрашиваем неопубликованные Правила поиска дубликатов
                QueryExpression query = new QueryExpression { EntityName = "duplicaterule" };
                query.Criteria.AddCondition("statecode", ConditionOperator.Equal, 0);   // Неактивные 
                query.Criteria.AddCondition("statuscode", ConditionOperator.Equal, 0);  // Не опубликованные

                EntityCollection results = service.RetrieveMultiple(query);
                
                // Просматриваем все найденные Правила и публикуем их
                List<Entity> rules = results.Entities.ToList();
                rules.ForEach(r =>
                {
                    service.Execute(new PublishDuplicateRuleRequest
                    {
                        DuplicateRuleId = r.Id
                    });
                });
            }
            catch (FaultException<OrganizationServiceFault> ex)
            {
                throw new InvalidPluginExecutionException("Ошибка: ", ex);
            }
        }
    }
}

Плагин просто получает все неопубликованные Правила обнаружения дубликатов и выполняет PublishDuplicateRuleRequest.



Комментарии (2)
  • Влад 02.09.2013

    А если изменения публикуют не через PublishAll, то чуда не случится. Правильно?

  • slivka_83 02.09.2013

    Можно еще и на Publish повесить.

*

code