2010-11-16 88 views
0

好吧,我已经花了两天的时间对自己和Entity Framework失去信心。我昨天发布了一个类似这样的问题,但由于我没有正确说明,我无法完全解决问题。这里又一次。Silverlight - 如何将关联的实体返回给客户端

首先,我正在使用RIA Services和Entity Framework编写一个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属性中的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()。为什么只有服务器?男人,我迷路了!

斯科特

回答

1

您需要有服务器端方面的实体[Include]属性。

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

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

+0

不可思议!这解决了我花了几天的时间。谢谢! – Scott 2010-11-16 22:32:42

+0

如果你有几分钟的时间,你能解释为什么我的元数据中的EntityCollection memeber需要这个属性,但是没有其他的属性需要这个属性?它有效,但我不知道为什么。谢谢。 – Scott 2010-11-16 22:33:46

+0

因为集合是指向新实体集的链接,而不是表的直接属性,所以RIA默认不会序列化它。你必须明确告诉RIA包含该属性以便序列化并发送给客户端。我相信它的主要原因是避免引用序列化,并最终导致数据传输量较大。 – Stephan 2010-11-17 14:24:45

相关问题