Silverlight - 如何将关联实体返回给客户端

时间:2010-11-16 21:36:49

标签: silverlight frameworks service entity ria

好的,我已经花了两天时间对自己和实体框架失去信心。我昨天发布了一个与此类似的问题,但由于我没有说错,我无法完全解决我的问题。再来一次。

首先,我正在使用RIA Services和Entity Framework编写Silverlight应用程序。在我的数据库中,我有两个非常简单的表:HeaderTable和DetailsTable。两者之间的关系是1对多。 EDM生成的属性可在这两个实体之间来回导航。例如,在HeaderTable中,我有一个名为DetailTables的属性,它是当前HeaderTable实体的所有DetailTalbe实体的集合。

保持简单,从客户端我想要返回所有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");
}

现在应该在我的标题中明确地显示我的详细信息,但就像我第一次尝试一样,当它到达客户端时,我的HeaderTable属性中的DetailTalbles属性为空。 就像测试一样,我决定看看服务器函数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()。为什么只有服务器?伙计,我迷路了!

-Scott

1 个答案:

答案 0 :(得分:1)

您需要在服务器端上下文中拥有实体的[Include]属性。

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

这应包含在服务器上模型的元数据文件中。