好的,我已经花了两天时间对自己和实体框架失去信心。我昨天发布了一个与此类似的问题,但由于我没有说错,我无法完全解决我的问题。再来一次。
首先,我正在使用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
答案 0 :(得分:1)
您需要在服务器端上下文中拥有实体的[Include]
属性。
[Include]
public EntitySet<DetailTable> DetailTables { get; set; }
这应包含在服务器上模型的元数据文件中。