Silverlight - как вернуть связанные сущности обратно клиенту - PullRequest
0 голосов
/ 17 ноября 2010

Хорошо, я потратил на это два дня и теряю уверенность как в себе, так и в Entity Framework. Я вчера опубликовал вопрос, похожий на этот, но так как я не сформулировал его правильно, я не смог полностью решить мою проблему. Вот и снова.

Прежде всего, я пишу приложение Silverlight с использованием RIA Services с Entity Framework. В моей базе данных есть две очень простые таблицы: HeaderTable и DetailsTable. Отношения между ними - 1 ко многим. EDM генерирует свойства для перемещения назад и вперед между этими двумя объектами. Например, в HeaderTable у меня есть свойство DetailTables, которое является коллекцией всех сущностей DetailTalbe для текущей сущности HeaderTable.

Проще говоря, от клиента я хочу вернуть ВСЕ сущности HeaderTable. Я делаю это так:

public void TestFromClient()
{
  if (context == null)
  {        
    context = new TestContext();
    EntityQuery<HeaderTable> query = context.GetHeaderTablesQuery();
    context.Load<HeaderTable>(query);
  }

В моем методе обратного вызова я действительно получаю коллекцию для всех элементов HeaderTable. Однако свойство (DetialTables), которое должно содержать все мои подробные записи, пусто. Поскольку эти объекты связаны, я подумал, что получу их во время запроса. Итак, когда я обнаружил, что я не получаю эти объекты, я внес изменения в свой GetHeaderTables () на сервере следующим образом:

public IQueryable<HeaderTable> GetHeaderTables()
{
  //return this.ObjectContext.HeaderTable;  // Original
  return this.ObjectContext.HeaderTable.Include("DetailTables");
}

Теперь это должно явным образом возвращать мои данные в мои заголовки, но точно так же, как и моя первая попытка, к тому времени, когда он доберется до клиента, свойство DetailTalbles в моем свойстве HeaderTable пусто. В качестве теста я решил посмотреть, что происходит внутри серверной функции GetHeaderTables (), и сделал это, чтобы отладить значение:

public IQueryable<HeaderTable> GetHeaderTables()
{
  //return this.ObjectContext.HeaderTable;  // Original
  //return this.ObjectContext.HeaderTable.Include("DetailTables");
  List<HeaderTable> test = this.ObjectContext.HeaderTable.Include("DetailTables").ToList();
}

Конечно, все мои сущности HeaderTable имели допустимое свойство DetailTables с набором всех деталей. Итак, он работает на сервере, но не работает на клиенте. Я явно что-то упускаю, но не могу понять, что. Если кто-то может увидеть, что я делаю неправильно, или посоветовать мне пойти по-другому, я весь слух.

В качестве примечания, я также не могу понять, почему я не могу указать Include () в контексте на стороне клиента. Почему только сервер? Чувак, я потерян!

-Скотт

1 Ответ

1 голос
/ 17 ноября 2010

Вам необходимо иметь атрибут [Include] в вашей сущности в контексте серверной части.

[Include]
public EntitySet<DetailTable> DetailTables { get; set; }

Это должно быть включено в ваши файлы метаданных для модели на сервере.

...