CRM2011 - SDK 5.0.3 - проблема с Linq to CRM - PullRequest
7 голосов
/ 31 мая 2011

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

  //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();
      }
    }       
  }

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

foreach (var c in a.contact_customer_accounts)

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

Ответы [ 2 ]

10 голосов
/ 16 июня 2011

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

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

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

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

Меня немного смущает ваш код, потому что вы используете объект CrmDataContext вместо объекта OrganizationServiceContext.Примеры кода в 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 со средствами доступа для всех различных типов объектов в вашей организации.

2 голосов
/ 18 июня 2011

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

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

Короче говоря, я размещаю здесь вызов 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:Xrm\Xrm.cs /url:http://Crm/Contoso/XRMServices/2011/Organization.svc /domain:CONTOSO /username:administrator /password:pass@word1 /namespace:Xrm /serviceContextName:XrmServiceContext
...