Как загрузить отношения сущностей второй степени с помощью службы данных WCF? - PullRequest
3 голосов
/ 12 октября 2010

Я пытаюсь запросить один объект в базе данных с помощью DataServiceQuery.Сущность, которую я пытаюсь загрузить, имеет отношение к графу других сущностей, которые я также хочу загрузить.MSDN описывает здесь и здесь , что я могу загрузить свои упомянутые объекты, используя либо DataServiceQuery .Expand, либо DataServiceContext.LoadProperty.

Это прекрасно работает для отношений первой степенимоей сущности, но у меня проблема с загрузкой отношений отношений.

Очевидно, что я мог бы вызвать LoadProperty для всех отношений второй степени и перебрать все коллекции второй степени, но я надеялся, что смогу загрузить всю связьграфик в одном запросе.Это возможно?

Редактировать

На самом деле загрузка отношений второй степени не так уж очевидна.Следующий код завершается ошибкой (модель домена изменена для ясности):

            var context = DataServiceReference.DataServiceContextFactory.Create();
            var customer = (from c in context.Customers.Expand("Orders")
                                where c.CustomerId.Equals(customerId)
                                 select c).First();
            foreach (var order in customer.Orders)
            {
                context.LoadProperty(order, "Products");

В последней строке выше выбрасывается InvalidOperationException: «Контекст в настоящее время не отслеживает сущность».Я использую самоконтроль сущностей.Может ли эта ошибка быть связана с STE?

Как я могу каким-либо образом загрузить отношения второй степени?

Редактирование решения

Оказывается, DataServiceQuery .Expand использует другой синтаксис пути по сравнению с ObjectQuery .Include.Первый использует косую черту в качестве разделителя пути, последний использует точку.Может кто-нибудь объяснить, почему синтаксис является несовместимым и где я могу найти документацию о синтаксисе пути Expand?

1 Ответ

5 голосов
/ 13 октября 2010

DataServiceContextFactory - ваш собственный класс, верно? (поскольку это не то, как вы обычно создаете экземпляр DataServiceContext). Предполагая, что в итоге создается обычный экземпляр DataServiceContext, способ загружать несколько уровней - просто указать несколько уровней в вызове Expand. Так, например: context.Customers.Expand ( "Заказы / Продукция") Вам вернут всех клиентов, их заказы и все товары для этих заказов. Чтобы LoadProperty работал, убедитесь, что в вашем DataServiceContext свойство MergeOption установлено в один из параметров, которые позволяют отслеживать. Обратите внимание, что отслеживание на стороне клиента не имеет ничего общего с отслеживанием EF на стороне сервера (технически это отдельный код на отдельной машине). Вы можете проверить, что контекст отслеживает рассматриваемый объект, пытаясь вызвать context.GetEntityDescriptor (myEntityInstance) Если он возвращает ненулевое значение, контекст отслеживает сущность, и LoadProperty должен работать.

...