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