У меня проблемы с возвратом нескольких сущностей (полная загрузка) с помощью метода Include (). Я пытаюсь загрузить документы в приложение Silverlight, используя службы RIA. Модель данных состоит из следующих отношений:
Events.ID = EventParticipants.EventsID
EventParticipants.ParticipantUserID = Users.ID
Таким образом, в событии может быть много участников, а участником является ровно 1 пользователь.
Я могу нормально загрузить событие, но не могу ничего из дочерних отношений, указанных в операторе Include ().
Когда я загружаю Событие, я пытаюсь включить (используя нетерпеливую загрузку) всех участников EventPart и их связанную пользовательскую запись. В моей доменной службе у меня есть следующее:
public IQueryable<Event> GetEvents()
{
return this.ObjectContext.Events
.Include("EventParticipants")
.Include("EventParticipants.User");
}
Затем я беру возвращаемый IQueryable и загружаю его, используя свой контекст домена на стороне клиента, следующим образом:
DomainContext.Load(DomainContext.GetEventsQuery(), LoadOperationCompleted, true);
(обычно я бы фильтровал это, но я все упростил, чтобы разобраться в сути проблемы)
В моем LoadOperationCompleted у меня есть 2 цикла, которые я использую, чтобы увидеть, возвращаются ли участники события, но я никогда не получаю каких-либо участников из запроса. (в базе данных у меня определено 242 события ... все участники имеют участников)
private void LoadOperationCompleted(LoadOperation lo)
{
if (lo.Error != null)
{
Debugger.Break();
lo.MarkErrorAsHandled();
}
foreach (Event item in lo.Entities)
{
foreach (var particpant in item.EventParticipants)
{
Debug.WriteLine("{0} {1}", particpant.User.First, particpant.User.Last);
}
}
}
Я также изменил приведенный выше код (см. Ниже), чтобы он вращался через исходный контекст домена вместо коллекции сущностей, которая передается через параметры операции загрузки, но безрезультатно. (события есть, детей нет)
foreach (Event item in DomainContext.Events)
В моей модели данных есть три конструктора (все сгенерированные) с различными параметрами. В каждом я отключил ленивую загрузку так:
this.ContextOptions.LazyLoadingEnabled = false;
В представлении xml-файла DataModel.edmx была аннотация. Я думаю, что это только для целей генерации ... но я тоже изменил это так:
<EntityContainer Name="MyCrazyEntities" annotation:LazyLoadingEnabled="false">
Я определил отношения в моей базе данных SQL Server 2008. Дизайнер поднял их и создал все отношения и свойства навигации в моей модели. Осматривая их, они кажутся действительными. Если я провожу пальцем правописание сущностей в операторе включения, оно выдает ошибку, говорящую, что путь недопустим (или что-то в этом роде) ... поэтому я считаю, что отношения существуют и являются функциональными (и я вижу их определения в коде конструктора и еще много чего).
Я удалил всю фильтрацию и, в частности, дополнительные объединения, которые я поместил в запрос перед его выполнением. Это должно было гарантировать, что я не столкнулся с проблемой с объединениями, изменяющими форму запроса и нарушающими Include (). Кажется, это большая проблема для людей, я удалил все соединения таким образом, чтобы изолировать проблему. Это не комбинация объединений и включает.
Я несколько раз перестраивал свои проекты Silverlight, в которых размещается служба домена и DLL-служба RIA Services, думая, что некоторые настройки были неверными. Я использовал генератор классов POCO с EF, но потом прочитал, что вы не можете включить то же самое с POCO ... так что я тоже отменил это и вернулся к генератору сущностей по умолчанию.
Я запустил профилировщик SQL Server и захватил SQL из базового запроса, и один с помощью Includes (). Данные для Включений ВОЗВРАЩАЮТСЯ . Я подтвердил это, скопировав запрос из профилировщика и выпустив его напрямую. Упрощенная версия запроса заключается в следующем. Отношения действительны, и я вижу, что все связанные данные есть (например, имена участников, номера телефонов и т. Д.)
SELECT
'trimmed fields for brevity>'
FROM ( SELECT
'trimmed fields for brevity>'
CASE WHEN ([Join1].[ID1] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C1]
FROM [dbo].[Events] AS [Extent1]
LEFT OUTER JOIN (SELECT 'trimmed fields for brevity>'
FROM [dbo].[EventParticipants] AS [Extent2]
INNER JOIN [dbo].[Users] AS [Extent3] ON [Extent2].[ParticipantUsersID] = [Extent3].[ID] ) AS [Join1] ON [Extent1].[ID] = [Join1].[EventsID]
) AS [Project1]
ORDER BY [Project1].[ID] ASC, [Project1].[C1] ASC
Однако, когда сущность возвращается, Event.EventParticipants EntityCollection становится пустым. К сожалению. Разочаровывающе. Больно. (У меня нет "ly" s)
Я искал в Интернете решения, но не нашел никого с той же проблемой, которая не была бы решена с помощью настройки отложенной загрузки, сочетания объединений и включений или неподходящих навигационных свойств.
Я только что пропустил некоторые основные вещи? Есть ли основная концепция, которую мне не хватает? У меня есть другой проект от старого работодателя, где они выполняют ту же самую операцию, и это, кажется, работает. Поэтому я уверен, что это можно сделать. Только не мной ??
Любая помощь очень ценится. Я в своем уме. Заранее спасибо!