Клиент OData не регидратируется с использованием $ expand

Я использую OData некоторое время и считаю его фантастическим инструментом для настройки моего сервера. Сегодня я наткнулся на то, чего раньше не видел, и это меня совершенно сбивает с толку.

Я использую .Expand на клиенте, чтобы запросить дерево данных для отчета при его получении. Я использовал точный запрос в прототипе, и он работал отлично (т.е. полностью гидратирован). Когда я использую Fiddler для отправки запроса, пакет ответа идеален и включает все данные, которые я ищу.

Проблема в том, что ни одно из расширенных свойств не было гидратировано клиентом (при этом ссылка на службу полностью обновлена ​​с учетом текущей службы). Чтобы попытаться понять, что происходит, я сузил область действия до одного свойства, но оно по-прежнему не работает.

var report = (serviceContext.Reports.Expand("ReportAreas").Where(r=>r.ReportID==reportID)).SingleOrDefault();

дает мне отчет, но ReportAreas содержит 0 элементов. Если я попробую:

serviceContext.LoadProperty(report,"ReportAreas");

тогда ReportAreas содержит около 20 элементов.

Это сводит меня с ума, потому что Expand работает для другого дерева объектов (другой запрос, но тот же функциональный код) без каких-либо проблем. Есть ли у кого-нибудь предложения относительно того, как я могу разобраться, что, черт возьми, здесь происходит ???

Обновление:

Некоторая новая информация по этому поводу сегодня, которая, возможно, более странная и предлагает мне ошибку в клиенте OData. Я обнаружил, что только часть объектов Report возвращается без заполнения расширенных свойств. БОЛЬШИНСТВО отчетов в базе данных в порядке. т.е. если я запрашиваю все отчеты с расширенными ReportAreas (вместо уточнения до одного reportID), около 80-90% имеют ненулевое количество для ReportAreas, а остальные имеют 0.

Когда отчет возвращается без каких-либо заполненных свойств (null или 0 count), фактические объекты свойств создаются И их свойства устанавливаются (из точек останова в файле Reference.cs для ссылки на службу), поэтому, например, ReportID Значения, PropertyAreaID и History, принадлежащие объектам ReportArea, устанавливаются 16 раз во время разрешения запроса, но при запросе в списке ReportAreas счетчик равен 0. Когда я использую _service.LoadProperty, он возвращает 16 ReportAreas.

Мне пахнет несоответствием ссылок в запросе Expand, но это слишком непротиворечиво, чтобы быть простой проблемой. Отчеты, которые работают ВСЕГДА, работают, а отчеты, которые не работают, НИКОГДА не работают. Очень надеюсь, что кто-то поможет мне определить это, чтобы я мог перейти к полезному кодированию ...


person Red Nightingale    schedule 23.03.2011    source источник
comment
Можете ли вы попробовать Fiddler и посмотреть, какой запрос (URL) отправляется на сервер и содержит ли ответ развернутые данные.   -  person Vitek Karas MSFT    schedule 23.03.2011
comment
Согласно параграфу 2, когда я использую Fiddler для отправки запроса, ответный пакет идеален (т.е. содержит все расширенные данные)   -  person Red Nightingale    schedule 31.03.2011
comment
Я понимаю, что когда вы отправляете запрос вручную из Fiddler, он работает. Я спрашивал, можно ли использовать Fiddler для просмотра запроса, отправленного клиентским приложением, особенно запрашиваемого URL-адреса и ответа.   -  person Vitek Karas MSFT    schedule 31.03.2011
comment
Ааа ... Сейчас нет времени проверять. Я займусь этим завтра утром.   -  person Red Nightingale    schedule 31.03.2011
comment
Хорошо, как я и подозревал, запрос и ответ сформированы идеально. Единственное, чего не происходит, - это объекты, появляющиеся как часть графа объектов. Я могу заполнить каждое из свойств с помощью service.Property (,), но это займет около 30 секунд.   -  person Red Nightingale    schedule 01.04.2011
comment
Ответы на каждый из запросов Property содержат одни и те же данные (за исключением некоторых различий в упаковке).   -  person Red Nightingale    schedule 01.04.2011
comment
Есть ли способ подключиться к процессу регидратации ???   -  person Red Nightingale    schedule 01.04.2011
comment
Такого крючка нет. Он должен работать. Не могли бы вы поделиться определением класса Report (в частности, свойства ReportAreas)?   -  person Vitek Karas MSFT    schedule 01.04.2011
comment
Я только что попробовал демонстрационный сервис на services.odata.org/OData/OData.svc . Просто добавьте ссылку на службу и напишите запрос: var category = ctx.Categories.Expand (Products) .Where (c = ›c.ID == 1) .SingleOrDefault (); Он правильно загружает продукты, как ожидалось.   -  person Vitek Karas MSFT    schedule 01.04.2011
comment
Я видел, как работает клиентская библиотека во многих случаях. В приложении, которое я пишу, он отлично работает с двумя другими классами. Просто для объекта Report он не работает. Как я уже упоминал, код прототипа (который в основном тот же, основанный на той же БД) на самом деле отлично работал и для отчета. Меня чертовски сбивает с толку, почему это не работает. Я постараюсь опубликовать структуры классов, сообщения и т. Д. Сегодня же.   -  person Red Nightingale    schedule 03.04.2011
comment
Я работаю над отдельным прототипом проекта и просто без проблем загрузил отчет с расширением. Я делал ссылку на службу обновлений несколько раз, но подозреваю, что удаление ссылки и ее повторное добавление, вероятно, решат мою проблему ... Я отправлю ответ, если это решит.   -  person Red Nightingale    schedule 04.04.2011
comment
Знак ... заговорил слишком рано. Похоже, что в ссылке на сервис есть некоторый уровень кэширования, поскольку он полностью заполняется только при втором вызове ПОСЛЕ того, как свойства были индивидуально заполнены. Я займусь классами и структурами данных сегодня же.   -  person Red Nightingale    schedule 04.04.2011


Ответы (1)


Решение этой проблемы (по крайней мере, пока я не пойму лучше) - установить

serviceContext.MergeOption = MergeOption.OverwriteChanges;

Мне сказали, что это связано с тем, что клиент не обновляет ссылки, если они уже отслеживаются. Я обновлю этот ответ, если узнаю больше / лучше пойму проблему.

person Red Nightingale    schedule 21.04.2011
comment
См. msdn.microsoft.com/en-us/ library / gg602811 (v = vs.103) .aspx По умолчанию клиент материализует запись в потоке ответов в объект только для тех сущностей, которые еще не отслеживаются DataServiceContext. Это означает, что изменения в объектах, уже находящихся в кэше, не перезаписываются. Это поведение контролируется указанием значения MergeOption для запросов и операций загрузки. - person Serge van den Oever; 25.02.2013
comment
Это не имеет отношения к исходной проблеме. Даже если бы определенные объекты были ранее загружены контекстом (чего у них не было), я все равно ожидал бы, что они появятся в коллекции ReportAreas. В противном случае ссылочная целостность базы данных полностью теряется, потому что я могу попытаться повторно вставить объекты, которые уже находятся на сервере, из-за того, что эти объекты «не присутствуют» на клиенте, когда я загружаюсь с сервера. - person Red Nightingale; 27.02.2013