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

Silverlight-如何将关联实体返回到客户端,silverlight,frameworks,service,entity,ria,Silverlight,Frameworks,Service,Entity,Ria,好的,我花了两天的时间在这上面,我对自己和实体框架都失去了信心。昨天我发布了一个类似的问题,但由于我没有正确表达,我无法完全解决我的问题。又来了 首先,我正在使用RIA服务和实体框架编写一个Silverlight应用程序。在我的数据库中有两个非常简单的表:HeaderTable和DetailsTable。两者之间的关系是一对多。EDM生成的属性可在这两个实体之间来回导航。例如,在HeaderTable中,我有一个名为DetailTables的属性,它是当前HeaderTable实体的所有Deta

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

首先,我正在使用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);
  }
public void TestFromClient()
{
if(上下文==null)
{        
context=newtestcontext();
EntityQuery=context.GetHeaderTablesQuery();
加载(查询);
}
在我的回调方法中,我确实获得了所有HeaderTable项的集合。但是,应该保存我所有详细记录的属性(DetialTables)为空。由于这些实体是相关的,我想我会在查询过程中获得它们。因此,一旦发现我没有获得这些实体,我就对GetHeaderTables()进行了更改在服务器上执行以下操作:

public IQueryable<HeaderTable> GetHeaderTables()
{
  //return this.ObjectContext.HeaderTable;  // Original
  return this.ObjectContext.HeaderTable.Include("DetailTables");
}
publicIQueryable GetHeaderTables()
{
//返回this.ObjectContext.HeaderTable;//原始
返回此.ObjectContext.HeaderTable.Include(“DetailTables”);
}
现在应该在我的头中显式地返回我的详细信息,但就像我的第一次尝试一样,当它到达客户端时,我的HeaderTable属性中的DetailTables属性是空的。 作为测试,我决定查看服务器函数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();
}
publicIQueryable GetHeaderTables()
{
//返回this.ObjectContext.HeaderTable;//原始
//返回此.ObjectContext.HeaderTable.Include(“DetailTables”);
列表测试=this.ObjectContext.HeaderTable.Include(“DetailTables”).ToList();
}
果然,我的所有HeaderTable实体都有一个有效的DetailTables属性,该属性包含所有详细信息的集合。因此,它在服务器上工作,但在客户端不工作。我显然遗漏了一些内容,但我不知道是什么。如果有人能看到我做错了什么,或者有人建议我以不同的方式进行操作,我很抱歉洗耳恭听

顺便说一句,我也不明白为什么我不能在客户端上下文中指定Include()。为什么只有服务器?伙计,我迷路了


-Scott

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

[Include]
public EntitySet<DetailTable> DetailTables { get; set; }
[包括]
公共EntitySet DetailTables{get;set;}

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

难以置信!这解决了我花了几天时间解决的问题。谢谢!如果您有几分钟的时间,您能解释一下为什么在我的元数据中EntityCollection Member上需要此属性,但其他属性都不需要此属性吗?它可以工作,但我不需要我不知道为什么。谢谢。因为集合是指向新实体集的链接,而不是表的直接属性,RIA在默认情况下不会序列化它。您必须明确告诉RIA包含该属性,以便它序列化并发送到客户端。我相信主要原因是避免序列化引用并最终导致错误大于预期的数据传输。