好吧,我花了两天时间在这上面,对自己和实体框架都失去了信心。我昨天贴了一个类似的问题,但是由于我没有把它说对,我无法完全解决我的问题。又来了。
首先,我在实体框架中使用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()。为什么只有服务器?伙计,我迷路了!
-斯科特