RIA服务和POCO类的问题,未发送相关的子集合

时间:2011-05-13 16:05:21

标签: silverlight-4.0 poco wcf-ria-services dto

这是我的设置:我有一些“数据”,它实际上是一个对象图(代表SSAS对象的DTO),我希望通过RIA服务进行序列化和发送,以供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()检索数据库集合,也很好地填充其子Cubes集合,但是,在客户端,cube集合是空的!我无法弄清楚如何使这项工作! (或者它可能不会?!)

有人知道为什么这不起作用以及如何解决它?我将不胜感激。

5 个答案:

答案 0 :(得分:0)

唯一与我如何做的不同的是公共IEnumerable Cubes {get;组;}。我通常会这样做:

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

此外,您需要一个Composition标签,如下所示:

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

答案 1 :(得分:0)

您是否在客户端检查EntitySet是否为Cube

如果没有,那么您还需要告诉RIA服务Cube是应该在客户端上生成的类。您可以通过在服务器端定义这样的虚拟方法来实现此目的:

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

如果EntitySet存在,您还应该检查外键是否正常。仅仅因为集合已填充在服务器上,并不意味着DatabaseID元素中的Cube是正确的。

答案 2 :(得分:0)

您可以在IsForeignKey对象上显式设置Association属性的Database属性

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

答案 3 :(得分:0)

您可能想要尝试的一件事是在构造函数中初始化Database上的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服务有时会出现一些奇怪的行为。

答案 4 :(得分:0)

我遇到了类似的问题,结果证明如果我将孩子添加到父母的集合中并且还专门设置父ID,它会起作用。

所以

    Database db = ...

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

如果我没有DatabaseID = db.ID,它们将被设置为零,RIA Services不会返回任何内容。错误?