Ссылка на сущность через поиск - PullRequest
0 голосов
/ 07 ноября 2018

/ * Я создал собственное имя сущности «Копия аккаунта». Когда я создаю запись в сущности «Учетная запись», копия этой записи также создается в «Копии учетной записи». Пока все хорошо, но когда я пытаюсь обновить запись сущности учетной записи, тогда также должна обновляться запись сущности копии учетной записи. Для этого мне нужна ссылка на сущность через поле поиска, которую я не могу выяснить. Пожалуйста, ведите меня. * /

using System;
using Microsoft.Xrm.Sdk;

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

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

            if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity && context.InputParameters != null)
            {
                Entity entity = (Entity)context.InputParameters["Target"];
                if (entity.LogicalName != "account") return;

                else if (entity.LogicalName == "account")
                {
                    try
                    {
                        if (context.MessageName == "Create")
                        {
                            //call create method
                            CreateRecord(service, entity);
                        }

                        else if (context.MessageName == "Update")
                        {
                            //call Update method
                            UpdateRecord(context, service, entity);
                        }
                    }
                    catch (Exception ex)
                    {
                        throw new InvalidPluginExecutionException(ex.Message);
                    }
                }

            }
        }
        private static void CreateRecord(IOrganizationService service, Entity account)
        {
            var accountcopy = new Entity("new_accountcopy");
            accountcopy["new_name"] = account.GetAttributeValue<string>("name");
            accountcopy["new_phone"] = account.GetAttributeValue<string>("telephone1");
            accountcopy["new_fax"] = account.GetAttributeValue<string>("fax");
            accountcopy["new_website"] = account.GetAttributeValue<string>("websiteurl");
            service.Create(accountcopy);

        EntityReference Entref = (EntityReference)account.Attributes["accountid"];
        Guid LookupId = Entref.Id;
        string logicalName = Entref.LogicalName;
        accountcopy["new_accountcopyid"]= new EntityReference(logicalName, LookupId);
        accountcopy["new_accountcopyid"] = null;
        }

        private static void UpdateRecord(IPluginExecutionContext context, IOrganizationService service, Entity account)
        {
            account.Attributes["name"] = "Max";
            account.Attributes["telephone1"] = "+422565895";
            account.Attributes["fax"] = "+426565898";
            account.Attributes["websiteurl"] = "www.max.com";

            if (context.Depth <= 1)
            {
                service.Update(account);
            }

        }
    }
}

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Если этот плагин зарегистрирован в Постоперации при создании сообщения объекта account, предполагая, что new_accountcopy объект получил accountid отношение поиска, приведенный ниже код будет работать.

Entity accountCopy = new Entity("new_accountcopy");

accountCopy["new_name"] = entity.Attributes["name"];
accountCopy["new_phone"] = entity.Attributes["telephone1"];
accountCopy["new_fax"] = entity.Attributes["fax"];
accountCopy["new_website"] = entity.Attributes["websiteurl"];
accountCopy["accountid"] = new EntityReference("account", entity.Id); //mapping the account lookup in account-copy record

service.Create(accountCopy);

Дополнительный совет: string LookUpaccountName = entref.LogicalName; правильный путь

Обновление : Мы говорим о двух разных вещах: отображение реляционного поиска и затем использование этого поиска для синхронизации данных из дальнейших обновлений.

Сценарий 1 (это был ваш первоначальный вопрос)

При создании новой записи учетной записи - плагин пост-создания для учетной записи сущность создает запись account-copy , и любая из этих записей будет иметь ссылку на другую запись при поиске. Я бы предположил, что это отношение никогда не изменится - нет необходимости синхронизировать обновление учетной записи.

Если у вас есть accountid поиск в new_accountcopy сущности - мой приведенный выше код работает.
(Или)
Если у вас есть new_accountcopyid поиск в account сущности, тогда следуйте этому коду:

Guid createdId = service.Create(accountcopy);

Entity toUpdate = new Entity("account");
toUpdate.Id = entity.Id;
toUpdate["new_accountcopyid"]= new EntityReference("new_accountcopy", createdId); //mapping the account-copy lookup in account record
service.Update(toUpdate);

Сценарий 2

В будущих обновлениях основной учетной записи вы можете получить соответствующую account-copy записать и обновить ее с account изменения.

Примечание. Поддерживайте плагин в асинхронном режиме.

0 голосов
/ 07 ноября 2018

Вот идея о том, как вы могли бы справиться с этим (и учтите, что я не тестировал этот код):

public void Execute(IServiceProvider serviceProvider)
{
    IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
    ITracingService tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));

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

    if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity && context.InputParameters != null )
    {
        Entity entity = (Entity)context.InputParameters["Target"];

        if (entity.LogicalName == "account")
        {
            try
            {
                UpdateInsertAccountCopy(entity);
            }
            catch (Exception ex)
            {
                throw new InvalidPluginExecutionException(ex.Message);
            }
        }

    }
}

public void UpdateInsertAccountCopy(Entity account)
{   
    //whether it is a create or an update, set the fields on a new entity object
    var copy = new Entity("new_accountcopy");
    copy["new_name"] = account.GetAttributeValue<string>("name");
    copy["new_phone"] = account.GetAttributeValue<string>("telephone1");
    copy["new_fax"] = account.GetAttributeValue<string>("fax");
    copy["new_website"] = account.GetAttributeValue<string>("websiteurl");

    //if there is an existing AccountCopy
    if(account.GetAttributeValue<EntityReference>("new_accountcopyid") != null
    {
        //set the Id on the new copy entity object
        copy.Id = account.GetAttributeValue<EntityReference>("new_accountcopyid").Id;
        //then update it
        service.Update(copy);
    }
    //otherwise, create the AccountCopy
    else
    {
        service.Create(copy);
    }           
}                   

И, возможно, вы захотите добавить обработку для удаления учетной записи, чтобы также удалить ее копию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...