Раннее связывание (early bound) в Microsoft Dynamics CRM

Если вы хотите использовать раннее связывание в Microsoft Dynamics CRM , то вам нужно использовать специальное приложение CrmSvcUtil, входящее в состав CRM SDK, позволяющее сгененрировать C# классы на основе существующей организации CRM.

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

CrmSvcUtil.exe /url:http://<serverName>/<organizationName>/XRMServices/2011/Organization.svc    /out:<outputFilename>.cs /username:<username> /password:<password> /domain:<domainName>    /namespace:<outputNamespace> /serviceContextName:<serviceContextName>

Давайте рассмотрим пример.

CrmSvcUtil.exe /out:entitie.cs /connectionstring:"Url=https://demoCRM.ru/CRM365;Domain=Domain;UserName=User;Password=password;AuthenticationType=AD"

Мы запускаем утилиту CrmSvcUtil.exe (перед началом работы не забудьте с помощью команды CD перейти в директорию, в которой хранится данная утилита), указываем:

  • имя выходного файла entitie.cs, в котором будут хранится все сгенерированные C# классы
  • строку подключения к CRM с помощью учетной записи Active Directory

В результате работы программы мы получим C# файл, который необходимо подключить к проекту и использовать для взаимодействия с сущностями CRM.

Давайте рассмотрим пример кода, создания, удаления, изменения и чтения (Create, Retrieve, Update, and Delete (CRUD) записей).

using System;
using System.ServiceModel;
using System.ServiceModel.Description;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
using Microsoft.Xrm.Sdk.Client;
 
namespace Microsoft.Crm.Sdk.Samples
{
    /// <summary>
    /// Демонстрация того, как выполняются операции 
    /// создания, восстановления, изменения и удаления базовых сущностей.
    /// </summary>
    public class CRUDOperations
    {
        private Guid _accountId;
        private Guid _parentAccountId;
        private OrganizationServiceProxy _serviceProxy;
        /// <summary>
        /// Данный метод выполняет подключение к службе организации CRM, 
        /// после чего выполняет создание, чтение, изменение и удаление объектов.
        /// </summary>
        /// <param name="serverConfig"> Содержит информацию о подключении к серверу. </param>
        /// <param name="promptforDelete"> Выполнять ли удаление созданных сущностей после работы. </param>
        public void Run(ServerConnection.Configuration serverConfig, bool promptforDelete)
        {
            try
            {
                // Подключение к службе организации.
                using (_serviceProxy = new OrganizationServiceProxy(serverConfig.OrganizationUri, serverConfig.HomeRealmUri, serverConfig.Credentials, serverConfig.DeviceCredentials))
                {
                    // Эта настройка необходима для поддержки классов раннего связывания.
                    _serviceProxy.EnableProxyTypes();
 
                    var parentAccount = new Account { Name = "Родительская организация" };
                    _parentAccountId = _serviceProxy.Create(account);
 
                    // Создаем объект Организации и добавляем ее в CRM.
                    var account = new Account { Name = "Дочерняя организация" };
                    _accountId = _serviceProxy.Create(account);
                    Console.Write($"{account.LogicalName} {account.Name} создана, ");
 
                    // Получаем запись со значениями указанных атрибутов.
                    // Никогда не используйте ColumnSet(true), это приводит к получению всех атрибутов, что очень сильно нагружает CRM.
                    var cols = new ColumnSet("name""address1_postalcode""lastusedincampaign""versionnumber"); 
                    var retrievedAccount = (Account)_serviceProxy.Retrieve("account", _accountId, cols);
                    Console.Write("восстановлена ");
 
                    // Получаем номер версии организации.
                    var versionNumber = retrievedAccount.VersionNumber;
 
                    if (versionNumber != null)
                    {
                        Console.WriteLine($"Версия № {versionNumber}, ");
                    }
 
                    // Изменим некоторые атрибуты сущности для обновления записи.
                    // Установим почтовый индекс.
                    retrievedAccount.Address1_PostalCode = "98052";
 
                    // Обнулим значение второго почтового индекса.
                    retrievedAccount.Address2_PostalCode = null;
 
                    // Установим значения выпадающих списков (OptionSet).
                    retrievedAccount.Address1_AddressTypeCode = new OptionSetValue((int)AccountAddress1_AddressTypeCode.Primary);
                    retrievedAccount.Address1_ShippingMethodCode = new OptionSetValue((int)AccountAddress1_ShippingMethodCode.DHL);
                    retrievedAccount.IndustryCode = new OptionSetValue((int)AccountIndustryCode.AgricultureandNonpetrolNaturalResourceExtraction);
 
                    // Установим денежное значение.
                    retrievedAccount.Revenue = new Money(5000000);
 
                    // Установим логическое значение.
                    retrievedAccount.CreditOnHold = false;
 
                    // Установим ссылку на другую сущность (lookup).
                    retrievedAccount.ParentAccountId = new EntityReference(Account.EntityLogicalName, _parentAccountId);
 
                    // Установим текстовое поле.
                    retrievedAccount.Description = "Какая-то дочерняя организация на Каймановых островах.";
 
                    // Обновляем значение в CRM.
                    _serviceProxy.Update(retrievedAccount);
                    Console.WriteLine("и обновлена.");
 
                    if(promptforDelete)
                    {
                        _serviceProxy.Delete(Account.EntityLogicalName, _accountId);
                        _serviceProxy.Delete(Account.EntityLogicalName, _parentAccountId);
                        Console.WriteLine("Созданные сущности были удалены.");
                    }
                }
            }
 
            // Отлавливаем все служебные ошибки, которые выбрасывает CRM.
            catch (FaultException<Microsoft.Xrm.Sdk.OrganizationServiceFault>)
            {
                // Обрабатываем исключения или передаем вызывающему методу.
                throw;
            }
        }
 
        static public void Main(string[] args)
        {
            try
            {
                // Получить веб-адреса целевой организации и учетные данные пользователя.
                ServerConnection serverConnect = new ServerConnection();
                ServerConnection.Configuration config = serverConnect.GetServerConfiguration();
 
                CRUDOperations app = new CRUDOperations();
                app.Run(config, true);
            }
            catch (System.Exception ex)
            {
                Console.WriteLine("Ошибка в работе приложения.");
                Console.WriteLine(ex.Message);
            }
            finally
            {
                Console.WriteLine("Нажмите <Enter> для выхода.");
                Console.ReadLine();
            }
        }
    }
}

Также рекомендую прочитать статью Добавление кнопки на меню-ленту (ribbon) Microsoft Dynamics CRM. Надеюсь информация про ранее связывание была вам полезна. А еще подписывайтесь на группу ВКонтакте, Telegram и YouTube-канал. Там еще больше полезного и интересного для программистов.