Если вы хотите использовать раннее связывание в 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-канал. Там еще больше полезного и интересного для программистов.