Разработка
09
Окт
1

Clone()

Некоторое время MS расширила SDK т.н. Developer Extensions, которые содержат много интересных методов, сильно упрощающих жизнь разработчика CRM.
Один из этих методов – функции клонирования, которая позволяет с помощью буквально пары строк создать клон какой-либо записи.

Ниже примера кода, который показывает, как в консольном приложении создать клон записи с помощью функции Clone() из пространства имен Microsoft.Xrm.Client:

using System;
using System.Collections.Generic;

using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Client;
using Microsoft.Xrm.Client;

using System.ServiceModel;
using System.ServiceModel.Description;
using System.Runtime.Serialization;

namespace Clone
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                // Подключаемся к CRM
                ClientCredentials credentials = new ClientCredentials();
                credentials.Windows.ClientCredential = new System.Net.NetworkCredential("Administrator", "1qaz@WSX", "D2012");
                Uri uri = new Uri("http://win-ebu0m4kvf06/superfirma/XRMServices/2011/Organization.svc");
                OrganizationServiceProxy proxy = new OrganizationServiceProxy(uri, null, credentials, null);
                proxy.ServiceConfiguration.CurrentServiceEndpoint.Behaviors.Add(new ProxyTypesBehavior());
                IOrganizationService service = (IOrganizationService)proxy;

                // Создаем тестовую запись Организации
                Entity parentaccount = new Entity("account");
                parentaccount.Attributes["name"] = "Parent Account";
                parentaccount.Attributes["telephone1"] = "Telephone1";

                Guid parentaccountid = service.Create(parentaccount);

                Console.WriteLine("Родительская запись: " + parentaccountid.ToString());

                // Клонируем запись, используя функцию Clone
                // Если в качестве параметра передать True (передается по умолчанию), то связанные с записью-прародителем дочерние записи будут соединены с записью-клоном
                Entity childaccount = parentaccount.Clone(true);

                // Обязательно удаляем поле с идентификатором записи из клонированного объекта
                childaccount.Attributes.Remove(childaccount.LogicalName + "id");
                // Удаляем какие-либо дополнительные поля из клонированного объекта 
                childaccount.Attributes.Remove("telephone1");

                // Создаем клон
                Guid childaccountid = service.Create(childaccount);

                Console.WriteLine("Клонированная запись: " + childaccountid.ToString());

                Console.WriteLine("Press <Enter> to exit.");
                Console.ReadLine();
            }
            catch (SaveChangesException ex)
            {
                throw ex;
            }
        }
    }
}

Логика здесь следующая:

  • Первым делом добавляем ссылку на Microsoft.Xrm.Client;
  • Создаем тестовую запись и получаем ее GUID;
  • Создаем объект-клон, используя всего лишь GUID записи-прародителя. Обратите внимание, что если в функцию Clone передать булевый параметр True (значение по умолчанию), то связанные дочерние записи для записи-прародителя также будут связаны с записью-клоном;
  • Обязательно удаляем атрибут primaryid из объекта-клона. Опционально можно удалить и любые другие атрибуты, которые не должны повторятся, согласно Вашей бизнес-логики;
  • Отправляем объект-клон в сервис CRM.


Комментарии (1)
  • Michael Goryachev 09.10.2014

    Пробовал использовать… вроди работает но не до конца.
    1. Клонирует хорошо одну сущность. как цеплять детей — не ясно. тру-фолс не работает?
    2. сначала пробовал в консоли — работает, перенес в кастом воркфлоу — говорит что не знает кто такое Microsoft.Xrm.Client.
    в итоге в погоне за передовыми технологиями потратил насколько часов — но в конце написал свою функцию клонирования — не менее хорошую 🙂

    protected Entity Clone(Entity toClone)
    {
    Entity clonedEntity = new Entity(toClone.LogicalName);
    foreach (KeyValuePair item in toClone.Attributes)
    {
    clonedEntity.Attributes.Add(item.Key, item.Value);
    }
    return clonedEntity;
    }

*

code