InitializeFrom
В CRM есть такая функциональность как маппинг – это когда Вы создаете какую-либо запись из связанного (1:N) Представления родительской записи. При этом из родительской записи в дочернюю копируются значения определенных полей (заданных в настройках связи).
Одним из побочных эффектов этого функционала является возможность создавать клоны записей. Для этого достаточно настроить связь объекта на самого себя, задать маппинг всех нужных полей и создать запись через связанное представление. При этом в JS функция копирования записи реализовывалась с помощью не поддерживаемого функционала.
Но SDK предоставляет возможность воспользоваться данным функционалом и поддерживаемым способом – для этого необходимо воспользоваться методом InitializeFromRequest.
using System; using System.Collections.Generic; using Microsoft.Xrm.Sdk; using Microsoft.Xrm.Sdk.Client; using Microsoft.Xrm.Sdk.Query; using Microsoft.Crm.Sdk.Messages; using System.ServiceModel; using System.ServiceModel.Description; using System.Runtime.Serialization; namespace InitializeFromRequestTest { class Program { static void Main(string[] args) { // Подключаемся к CRM ClientCredentials credentials = new ClientCredentials(); credentials.Windows.ClientCredential = new System.Net.NetworkCredential("Administrator", "1qaz@WSX", "D2012"); Uri uri = new Uri("http://crm2015/superfirma/XRMServices/2011/Organization.svc"); OrganizationServiceProxy proxy = new OrganizationServiceProxy(uri, null, credentials, null); proxy.ServiceConfiguration.CurrentServiceEndpoint.Behaviors.Add(new ProxyTypesBehavior()); IOrganizationService service = (IOrganizationService)proxy; // Создаем запрос InitializeFromRequest initialize = new InitializeFromRequest(); initialize.TargetEntityName = "contact"; // Создаваемый объект initialize.EntityMoniker = new EntityReference("account", new Guid("33A38732-26F4-E411-80B7-000C291AFB9D")); // Родительская запись из которой создаем дочернюю запись initialize.TargetFieldType = TargetFieldType.All; // Поля инициализируемые с родительской записи InitializeFromResponse initialized = (InitializeFromResponse) service.Execute(initialize); if (initialized.Entity != null) { // Получаем объект из запроса Entity entity = initialized.Entity; // Задаем необходимые поля entity.Attributes.Add("firstname", "John"); entity.Attributes.Add("lastname", "Smith"); // Создаем запись service.Create(entity); } } } }
InitializeFromRequest не создает запись, но возвращает целевой объект с маппингом всех настроенных полей. Данный объект Вы можете изменить/дополнить своими полями (или нет) и создать из него запись в CRM.