Проблема с RIA Services и классами POCO, связанная дочерняя коллекция не отправляется - PullRequest
2 голосов
/ 13 мая 2011

Вот мои настройки: у меня есть некоторые «данные», которые на самом деле представляют собой граф объектов (DTO, представляющих объекты SSAS), которые я хочу сериализовать и отправить через RIA Services для использования приложением silverlight. Вот простой пример этого:

public class Database
{
   [Key]
   public int ID { get; set;}

   public string Name { get; set;}

   [Include]
   [Association("DatabaseCue", "ID", "DatabaseID"]
   public IEnumerable<Cube> Cubes { get; set;}
}
public class Cube
{
   [Key]
   public int ID { get; set;}

   public int DatabaseID { get; set;}

   public string Name { get; set;}

   // other Cube properties
}

И у меня есть DomainService:

[EnableClientAccess()]
public class AmoService : DomainService
{
   public IQueryable<Database> GetDatabases()
   {
       return myAmoAdapter.GetDatabases();
   }
}

myAmoAdapter.GetDatabases() извлекает коллекцию базы данных, заполняя также ее дочернюю коллекцию кубов, но на стороне клиента коллекция кубов пуста! Я не могу понять, как заставить это работать! (а может, просто не будет?!)

Кто-нибудь знает, почему это не работает и как это исправить? Буду благодарен.

Ответы [ 5 ]

0 голосов
/ 17 декабря 2011

У меня была похожая проблема, и оказалось, что она будет работать, если я добавлю дочерний элемент в коллекцию родителей, а также специально установлю родительский идентификатор.

Так

    Database db = ...

    db.Cubes.Add(new Cube(){ID=1, DatabaseID=db.ID, Name = "Cube1" });

если бы у меня не было DatabaseID = db.ID, они были бы установлены в ноль и ничего не было бы возвращено службами RIA. Ошибка?

0 голосов
/ 09 июня 2011

Одна вещь, которую вы, возможно, захотите попробовать, - это инициализировать коллекцию Cubes в базе данных в конструкторе.

public class Database
{
  public Database
  {
    Cubes = new List<Cube>();
  }

  [Key]
  public int ID { get; set;}

  public string Name { get; set;}

  [Include]
  [Association("DatabaseCue", "ID", "DatabaseID"]
  public IEnumerable<Cube> Cubes { get; set;}
}

Службы RIA могут иногда демонстрировать странное поведение, если коллекции Associated Entity не инициализируются.

0 голосов
/ 14 мая 2011

Проверяли ли вы на стороне клиента, есть ли у него EntitySet для Cube?

Если это недоступно, вам также нужно сообщить RIA Services, что Cube - это класс, который должен быть сгенерирован на клиенте. Вы можете сделать это, определив фиктивный метод, например, на стороне сервера:

public IQueryable<Cube> GetCubesDummy()
{
   return new List<Cube>().AsQueryable();
}

Если EntitySet существует, вам также следует проверить, в порядке ли внешние ключи. То, что коллекция заполнена на сервере, не означает, что DatabaseID в элементах Cube является правильным.

0 голосов
/ 18 мая 2011

Вы можете явно установить свойство IsForeignKey атрибута Association для объекта Database

[Include]
[Association("DatabaseCue", "ID", "DatabaseID", IsForeignKey = false]
public IEnumerable<Cube> Cubes { get; set;}
0 голосов
/ 13 мая 2011

Единственное, что отличается от того, как я это делаю, - это общедоступные IEnumerable Cubes {get;задавать;}.Обычно я делаю это следующим образом:

public List<Cube> Cubes { get; set;}

Кроме того, вам нужен тег Composition следующим образом:

[Include]
[Composition]
[Association("DatabaseCue", "ID", "DatabaseID"]
public IEnumerable<Cube> Cubes { get; set;}
...