代码之家  ›  专栏  ›  技术社区  ›  Scott

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

  •  0
  • Scott  · 技术社区  · 14 年前

    好吧,我花了两天时间在这上面,对自己和实体框架都失去了信心。我昨天贴了一个类似的问题,但是由于我没有把它说对,我无法完全解决我的问题。又来了。

    首先,我在实体框架中使用RIA服务编写Silverlight应用程序。在我的数据库中,有两个非常简单的表:HeaderTable和DetailsTable。两者的关系是一对多。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属性中的detailtalables属性是空的。 作为一项测试,我决定查看服务器函数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 回复  |  直到 14 年前
        1
  •  1
  •   Stephan    14 年前

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

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

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