CRM2011 — SDK 5.0.3 — Проблема с привязкой к объектам CRM

#linq #dynamics-crm-2011

#linq #dynamics-crm-2011

Вопрос:

Я использую crmsvcutil для генерации ранних связанных типов. Во времена crm 4.0 можно было загружать связанные объекты, просто нажав на объект.Свойство дочерних объектов.

   //Winvs.Next.Entities.CrmDataContext dc = new Entities.CrmDataContext(new Microsoft.Xrm.Sdk.Client.OrganizationServiceContext(
  var cred = new System.ServiceModel.Description.ClientCredentials();
  cred.Windows.ClientCredential = System.Net.CredentialCache.DefaultNetworkCredentials;
  //      
  using (var organizationServiceProxy = new Microsoft.Xrm.Sdk.Client.OrganizationServiceProxy(new Uri(System.Configuration.ConfigurationManager.ConnectionStrings["CrmConnection"].ConnectionString), null, cred, null))
  using (Winvs.Next.Entities.CrmDataContext dc = new Entities.CrmDataContext(organizationServiceProxy))
  {
    // This statement is required to enable early-bound type support.
    organizationServiceProxy.ServiceConfiguration.CurrentServiceEndpoint.Behaviors.Add(new Microsoft.Xrm.Sdk.Client.ProxyTypesBehavior());
    //
    foreach (var a in dc.AccountSet)
    {
      foreach (var c in a.contact_customer_accounts)
      {
        c.FullName.ToString();
      }
    }       
  }
  

Когда я делаю это с последней версией CRM 2011 SDK, вместо загрузки реальных объектов я получаю исключение NullReferenceException, которое не дает мне дополнительной информации о проблеме.

 foreach (var c in a.contact_customer_accounts)
  

Чего я не понимаю? Как я могу загрузить связанные объекты с помощью CRM2011 Linq?

Ответ №1:

У меня была точно такая же проблема, как и у вас. Я увидел эти свойства и был озадачен тем, почему они всегда возвращаются null . Они явно были предназначены для извлечения объектов для определенной взаимосвязи, однако они казались «бездействующими».

Мне пришло в голову, что, возможно, объект context не был настроен должным образом для отложенной загрузки этих свойств «навигации» (если позаимствовать термин из Entity Framework). Итак, я начал изучать все, что мог, о OrganizationServiceContext и нашел это немного о его LoadProperty методе:

Если свойство представляет собой ассоциацию, ссылку или отложенное свойство, вызов этого метода предоставляет клиенту способ ленивой загрузки связанных ресурсов.

Это звучало как то, что мне было нужно, и одна из перегрузок принимает Entity и a Relationship в качестве входных данных. Итак, как только у вас есть экземпляр объекта с одной или несколькими взаимосвязями, вам нужно попросить контекст загрузить соответствующие свойства. Имейте в виду, что объект должен быть присоединен к контексту либо автоматически (поскольку вы извлекли объект с помощью контекстного запроса), либо вручную с помощью Attach метода.

Меня немного смущает ваш код, потому что вы используете CrmDataContext объект, а не OrganizationServiceContext object. В примерах кода в SDK 2011 используется последнее, а crmsvcutil даже сгенерирует пользовательский экземпляр OrganizationServiceContext с методами в форме «[ENTITY_NAME]Set» (т.е. AccountSet как в вашем примере). Возможно, вам потребуется переключиться на более новый тип контекста.

Итак, используя ваш пример и предполагая, что dc теперь это экземпляр OrganizationServiceContext , это будет выглядеть следующим образом:

 Relationship contactRel = new Relationship("contact_customer_accounts");
foreach (var a in dc.AccountSet) {

    dc.LoadProperty(a, contactRel); // Tell context to load entities from this relationship

    foreach (var c in a.contact_customer_accounts) {
        c.FullName.ToString();
    }

}
  

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


Примечание: Чтобы заставить crmsvcutil сгенерировать пользовательский OrganizationServiceContext , укажите переключатель serviceContextName:

 crmsvcutil.exe /url:<your_crm_url> /out:Xrm.cs /serviceContextName:XrmServiceContext
  

Это создало бы производный класс с именем XrmServiceContext и средствами доступа для всех различных типов объектов в вашей организации.

Комментарии:

1. Спасибо за ваш ответ. Я думаю, что нашел ответ на нашу проблему, используя последнюю версию SDK 5.0.4, которая предоставляет дополнительную справку и рабочий образец по теме класса объектов xrm. Похоже, что первые выпуски SDK не были готовы и доработаны для связанных с XRM вещей, таких как классы сущностей.

Ответ №2:

Я действительно понятия не имею, почему это так, но после нескольких сеансов исследования выяснилось, что для генерации классов объектной модели entity необходимо использовать сборку настройки кода, предоставленную xrm.

Предоставляется образец SDK версии 5.0.4, в котором собран образец консоли, демонстрирующий, как генерировать и использовать классы сущностей так, как мы все привыкли со времен CRM 4.0 xrm.

Короче говоря, я публикую здесь вызов crmsvcutil, для получения дополнительной информации вам следует обратиться к образцу пошагового руководства sdk: Создайте консольное приложение, которое подключается к Microsoft Dynamics CRM 2011, используя расширения для разработчиков http://technet.microsoft.com/en-us/library/gg695803.aspx

 CrmSvcUtil.exe /codeCustomization:"Microsoft.Xrm.Client.CodeGeneration.CodeCustomization, Microsoft.Xrm.Client.CodeGeneration" /out:XrmXrm.cs /url:http://Crm/Contoso/XRMServices/2011/Organization.svc /domain:CONTOSO /username:administrator /password:pass@word1 /namespace:Xrm /serviceContextName:XrmServiceContext