我有Silverlight 4 RIA服务应用程序,其中有一个Sprinkler类,它有一个子集合Depths。 Sprinkler和Depth是SQL数据库中的两个表,其中一个Sprinkler具有许多深度。
我从一个类调用查询,因此:
Context.GetRunsForSelectedSprinkler(currentSprinkler.CurrentSprinkler, OnLoadListCompleted, null);
和我在同一个类中访问查询结果的方法是:
private void OnLoadListCompleted(InvokeOperation<IEnumerable<Sprinkler>> invOp)
{
IEnumerable<Sprinkler> testRuns = invOp.Value;
}
我在DomainService中的查询是
[Invoke]
public IEnumerable<Sprinkler> GetRunsForSelectedSprinkler(string selectedSprinkler)
{
// this.ObjectContext.ContextOptions.LazyLoadingEnabled = true;
var sprinklers = (this.ObjectContext.Sprinklers.Include("Depths").Where(c => c.Sprinkler1 == selectedSprinkler));
return sprinklers;
}
我使用debug发现,在此查询GetRunsForSelectedSprinkler中,喷头中每个喷头的深度集合都已正确填充。但是,在接收此查询结果的OnLoadListCompleted方法中,尽管Sprinkler表中的喷洒器数据存在,但由查询填充的Depths子集合(由于Include(“Depths”))现在不存在和深度为空。不知何故,这个深度集合在返回过程中丢失了。
有谁知道如何解决这个问题?
我广泛使用Google,我认为查询是正确的,但我找不到任何有关未能返回子集合的信息。
我尝试在元数据中为深度集合添加[Include],但这没有效果。我也试过设置this.ObjectContext.ContextOptions.LazyLoadingEnabled = true;
而不是,但它没有效果。
查询正确执行但结果未正确返回到OnLoadListCompleted,并且它以某种方式丢失了相关的子数据。
答案 0 :(得分:0)
如果一个人不断猜测正确的关键词,那么谷歌就能得到正确答案,我现在可以回答我自己的问题了。我按照这个页面上的建议:
http://silverlightguy.com/2010/07/23/trick-for-solving-wcf-ria-services-issue/
解决了我的问题,并且正确地返回了子集合。
这似乎是RIA服务中的一个已知问题,即使很难发现。我也找到了这个页面:
InvokeOperation entities become null
并尝试使我的查询而不是Invoke,但是在找到上述方法之前没有完成解决方法,所以不知道这是否有效。
我也发现这个页面提到了这个问题,但没有跟进它。
Silverlight 4 LoadOperation returns null
感谢上面发布的那些人。